MicroFlighter 之STM32F103学习——(2)编写第一个STM32程序
2012-12-31 11:52
423 查看
因为第一次接触STM的单片机,各种寄存器和API都不熟悉,于是结合STM的库函数和编程手册对照理解。建立好工程之后,编写main函数。
1.不管哪种单片机,上电以后第一重要的事就是设置时钟和初始化引脚。单看STM32F的时钟:
能作为STM32F103的系统时钟的有三种,外部时钟,内部时钟,PLL时钟。
感觉STM的库写的不好的是如果72MHz时钟不正常,时钟初始化函数没用任何返回信息,只能在STM提供的函数中增加:
![](http://img.my.csdn.net/uploads/201212/31/1356927199_6103.jpg)
有失程序的灵活性和独立性。
而初始化代码中的各种寄存器定义的赋值参考STM编程手册,就明白了。主要的寄存器有这些:
![](http://img.my.csdn.net/uploads/201212/31/1356929202_5697.jpg)
2.设置GPIO: 点亮一个Led:PA3---电阻--Led--GND
Ctr+F5开始Debug,运行程序,察看效果(下载程序之后程序没有直接执行,不知道我设置的问题还是本身就这样子)。
后来发现可以在这里设置:
![](http://img.my.csdn.net/uploads/201212/31/1356932272_3676.jpg)
3.使用printf函数。需要配置选项,不然的话,只要加入了printf,程序不能正常运行。 使用技巧参考 http://www.amobbs.com/thread-5061319-1-1.html
1.不管哪种单片机,上电以后第一重要的事就是设置时钟和初始化引脚。单看STM32F的时钟:
能作为STM32F103的系统时钟的有三种,外部时钟,内部时钟,PLL时钟。
int main(void) { SystemInit(); return 0; }跟踪到SystemInit里面,一开始CPU工作于内部时钟,代码初始化一些时钟寄存器的值。然后调用SetSysSClock()设置新的时钟源。
static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz SetSysClockTo72(); #endif /* If none of the define above is enabled, the HSI is used as System clock source (default after reset) */ }可以看到用户只需要定义相应的宏就可以设定时钟。宏定义在本文件的最上面。我使用的芯片是STM32F103C6T8,文件中定义了
SYSCLK_FREQ_72MHz
感觉STM的库写的不好的是如果72MHz时钟不正常,时钟初始化函数没用任何返回信息,只能在STM提供的函数中增加:
![](http://img.my.csdn.net/uploads/201212/31/1356927199_6103.jpg)
有失程序的灵活性和独立性。
而初始化代码中的各种寄存器定义的赋值参考STM编程手册,就明白了。主要的寄存器有这些:
![](http://img.my.csdn.net/uploads/201212/31/1356929202_5697.jpg)
2.设置GPIO: 点亮一个Led:PA3---电阻--Led--GND
int main(void) { //SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开APB2时钟,GPIO都是挂在APB2上的 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // 设置IO模式(模式,速度,引脚等等) GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_3); // GPIOA->BSRR = GPIO_Pin_3; //置位 while(1) { GPIO_SetBits(GPIOA, GPIO_Pin_3); // 其实就是 GPIOA->BSRR = GPIO_Pin_3; delay(1000); GPIO_ResetBits(GPIOA, GPIO_Pin_3); //等价于 GPIOA->BRR = GPIO_Pin_3; delay(1000); } return 0; }
Ctr+F5开始Debug,运行程序,察看效果(下载程序之后程序没有直接执行,不知道我设置的问题还是本身就这样子)。
后来发现可以在这里设置:
![](http://img.my.csdn.net/uploads/201212/31/1356932272_3676.jpg)
3.使用printf函数。需要配置选项,不然的话,只要加入了printf,程序不能正常运行。 使用技巧参考 http://www.amobbs.com/thread-5061319-1-1.html
相关文章推荐
- .NET 学习笔记(二)——用vs编写的第一个程序
- Django学习笔记2-编写第一个Django程序
- Objective-C学习笔记(三)——用Objective-C编写第一个程序:Hello,World!
- OpenGL入门学习——第一课 编写第一个OpenGL程序
- 【黑马程序员】Java基础学习技术博客——配置环境变量和编写第一个Java程序
- ExtJS 学习笔记一(安装Eclipse的Spket插件并编写第一个ExtJS程序)
- OpenGL入门学习之一——编写第一个OpenGL程序
- STM32学习第一个程序,LED灯
- 我的java学习路之编写第一个程序
- scala学习-1-eclipse编写第一个程序unknown scala version problem
- [原创]java WEB学习笔记54:Struts2学习之路--- 编写Struts2 的第一个程序,HelloWord,简述 package ,action,result
- [汇编语言学习笔记][第四章第一个程序的编写]
- [置顶] [汇编语言学习笔记][第四章第一个程序的编写]
- Objective-C学习笔记(三)——用Objective-C编写第一个程序:Hello,World!
- STM32 学习二 程序编写及GPIO调试
- STM32学习之第一个程序(点亮LED)
- C#入门经典学习2-编写C#第一个程序
- Java学习2——HelloWorld(编写第一个java程序)
- MicroFlighter 之STM32F103学习——(1)STM32F10X编译环境和工程建立
- 参照《精通QT4编程》编写第一个QT程序总是失败