从零开始学STM32(开贴记录我的学习历程)

2019-07-24 13:22发布

本人以前学过51单片机,知道ARM这个东西后一直向往,最近终于入手一块“战舰V3 精英板”(买板子的时候,没注意看板子资源,看到“精英”二字,以为是STM32F103ZET6板子里面最牛的,而且看价格还不是最贵的,果断买了精英板),经过几天的C语言学习、keil安装及使用学习、Jlink使用学习、工程模板(基于固件库)建立……我的STM32学习终于走上正轨。之前听过别人分享如何学习STM32,其中强调了一点,就是加入一个论坛,在论坛中跟大家一起学习,共同进步,于是今天就开贴(以前水过,从来没发过贴),从零开始学习STM32(以前学过51,但是没了解过STM32,不知道算不算从零开始),记录我的学习历程,记录一个系统性地学习STM32的过程,以求跟坛友共同进步,同时以后传递给别人准备学STM32的人一些经验。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
49条回答
忘月19920216
2019-07-25 14:39
【2016-03-05】跑马灯
由于刚入手板子,又是周末,虽然我视频还没看到跑马灯这里来,但是还是忍不住想自己写下程序到板子上跑一下;
1、查看板子电路图,找到个LED分别连到MCU的IO口的哪个引脚;
2、查看原子跑马灯例程并理解过程(还不会STM32,先看着学,因为心急,还没看视频);
3、关掉例程,复制自己的空工程模板,写跑马灯代码;
4、仿真调试,思考总结,记录发帖;


1、查看板子电路图,找到个LED分别连到MCU的IO口的哪个引脚;
    我的板子是精英板:LED0->B5;LED1->E5;IO连接到LED阴极(IO口输出0点亮LED);
2、查看原子跑马灯例程并理解过程(还不会STM32,先看着学,因为心急,还没看视频);
    跑马灯程序编写思路:①配置IO口时钟->②配置IO口->③重复“LED0亮,LED1灭” <--> “LED0灭,LED1亮”两种状态切换,并在中间加适当延时;
3、复制自己的空工程模板,写跑马灯代码;
    直接写在main.c里面,以前听别人说这样的习惯不好,我准备调通了再学例程那样单独建个文件;
    这是我仿照例程新建工程模板的写法打的程序,函数从各个库文件里找到复制出来的;(写的第一个程序就失败了
[mw_shl_code=applescript,true]#include "stm32f10x.h"
#include "delay.h"
#include "stm32f10x_rcc.h"

int main(void)
{       
   
   GPIO_InitTypeDef GPIO_InitStructure;
   
   delay_init();
   RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE , ENABLE);
   
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   
   GPIO_Init(GPIOB,&GPIO_InitStructure);
   GPIO_SetBits(GPIOB, GPIO_Pin_5);
   
   GPIO_Init(GPIOE,&GPIO_InitStructure);
   GPIO_SetBits(GPIOE, GPIO_Pin_5);
   
   while(1)
   {
      GPIO_SetBits(GPIOB, GPIO_Pin_5);
      GPIO_ResetBits(GPIOE, GPIO_Pin_5);
      delay_ms(500);
      GPIO_ResetBits(GPIOB, GPIO_Pin_5);
      GPIO_SetBits(GPIOE, GPIO_Pin_5);
      delay_ms(500);
   }
}[/mw_shl_code]
4、仿真调试;

    下载程序到板子上,发现没反应,怕自己没选择复位,就按下板子的复位,还是没反应,然后就去DEBUG,发现程序执行完配置IO口PB5那里后,IO口的PB5模式并没有变化,不得已,又打开例程,DEBUG,观察到执行配置PB5后,PB5模式变成想要设定的那样,然后我就把例程里的配置全部复制到我自己的工程里,一句一句地对,看自己是不是哪个字符写错了(虽然keil5没报错,但是第一次写程序,还是怕打错字),没有观察到哪里不一样,注释掉自己的,DEBUG例程那一段,PB5能正常配置,注释掉例程,DEBUG自己那一段,PB5不能正常配置,纳闷了,后面终于观察到“RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE , ENABLE);”这一句有问题,我怎么就复制个APB1的函数出来了,改成APB2,之后一切正常,自己的LED终于闪烁起来了;(之后去翻了下时钟系统相关的资料,知道了IO口是由APB2提供,不能有APB1提供)
    接下来就把LED的代码仿照例程“跑马灯”的样式写在一个led.c文件里,也仿照着写一个led.h文件(其实算是复制的),以后的工程里,就可以直接加入这个文件,使用LED了。


一周热门 更多>