嵌入式MicroFlighter 之STM32F103学习——编写第一个STM32程序

  因为第一次接触STM的单片机,各种寄存器和API都不熟悉,于是结合STM的库函数和编程手册对照理解。建立好工程之后,编写main函数。

  1.不管哪种单片机,上电以后第一重要的事就是设置时钟和初始化引脚。单看STM32F的时钟:

  能作为STM32F103的系统时钟的有三种,外部时钟,内部时钟,PLL时钟。

  [cpp] view plain copy

  1. int main(void)

  2. {

  3. SystemInit();

  4. return 0;

  5. }

  跟踪到SystemInit里面,一开始CPU工作于内部时钟,代码初始化一些时钟寄存器的值。然后调用SetSysSClock()设置新的时钟源。

  [cpp] view plain copy

  1. static void SetSysClock(void)

  2. {

  3. #ifdef SYSCLK_FREQ_HSE

  4. SetSysClockToHSE();

  5. #elif defined SYSCLK_FREQ_24MHz

  6. SetSysClockTo24();

  7. #elif defined SYSCLK_FREQ_36MHz

  8. SetSysClockTo36();

  9. #elif defined SYSCLK_FREQ_48MHz

  10. SetSysClockTo48();

  11. #elif defined SYSCLK_FREQ_56MHz

  12. SetSysClockTo56();

  13. #elif defined SYSCLK_FREQ_72MHz

  14. SetSysClockTo72();

  15. #endif

  16.

  17. /* If none of the define above is enabled, the HSI is used as System clock

  18. source (default after reset) */

  19. }

  可以看到用户只需要定义相应的宏就可以设定时钟。宏定义在本文件的最上面。我使用的芯片是STM32F103C6T8,文件中定义了

  [cpp] view plain copy

  1. SYSCLK_FREQ_72MHz

  感觉STM的库写的不好的是如果72MHz时钟不正常,时钟初始化函数没用任何返回信息,只能在STM提供的函数中增加:

  有失程序的灵活性和独立性。

  而初始化代码中的各种寄存器定义的赋值参考STM编程手册,就明白了。主要的寄存器有这些:

  

  2.设置GPIO: 点亮一个Led:PA3---电阻--Led--GND

  [cpp] view plain copy

  1. int main(void)

  2. {

  3. //SystemInit();

  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开APB2时钟,GPIO都是挂在APB2上的

  5. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // 设置IO模式(模式,速度,引脚等等)

  6. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  8. GPIO_Init(GPIOA, &GPIO_InitStructure);

  9. GPIO_SetBits(GPIOA, GPIO_Pin_3); // GPIOA->BSRR = GPIO_Pin_3; //置位

  10.

  11. while(1)

  12. {

  13. GPIO_SetBits(GPIOA, GPIO_Pin_3); // 其实就是 GPIOA->BSRR = GPIO_Pin_3;

  14. delay(1000);

  15. GPIO_ResetBits(GPIOA, GPIO_Pin_3); //等价于 GPIOA->BRR = GPIO_Pin_3;

  16. delay(1000);

  17. }

  18. return 0;

  19. }

  Ctr+F5开始Debug,运行程序,察看效果(下载程序之后程序没有直接执行,不知道我设置的问题还是本身就这样子)。

  后来发现可以在这里设置:

  

 

  3.使用printf函数。需要配置选项,不然的话,只要加入了printf,程序不能正常运行。 使用技巧参考 http://www.amobbs.com/thread-5061319-1-1.html

          想要观看跟多相关视频:www.makeru.com.cn/?t=12

          嵌入式学习交流群:561213221

原文地址:https://www.cnblogs.com/huan-huan/p/8473222.html