zoukankan      html  css  js  c++  java
  • 嵌入式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

  • 相关阅读:
    C#生成安装文件后自动附加数据库的思路跟算法
    c#压缩和解压缩文件
    如何远程备份sql server数据库
    计算一年中的第几周/c#得到阳历对应农历日期
    C·处理数据库备份
    字符串提取替换后再替换回去 和 函数将数字转换中文数字
    Visual C#的Excel编程
    数据库备份和恢复
    blog
    请问谁知道DOTMSN中打开聊天对话框的方法是什么?
  • 原文地址:https://www.cnblogs.com/huan-huan/p/8473222.html
Copyright © 2011-2022 走看看