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

2019-07-24 13:22发布

本人以前学过51单片机,知道ARM这个东西后一直向往,最近终于入手一块“战舰V3 精英板”(买板子的时候,没注意看板子资源,看到“精英”二字,以为是STM32F103ZET6板子里面最牛的,而且看价格还不是最贵的,果断买了精英板),经过几天的C语言学习、keil安装及使用学习、Jlink使用学习、工程模板(基于固件库)建立……我的STM32学习终于走上正轨。之前听过别人分享如何学习STM32,其中强调了一点,就是加入一个论坛,在论坛中跟大家一起学习,共同进步,于是今天就开贴(以前水过,从来没发过贴),从零开始学习STM32(以前学过51,但是没了解过STM32,不知道算不算从零开始),记录我的学习历程,记录一个系统性地学习STM32的过程,以求跟坛友共同进步,同时以后传递给别人准备学STM32的人一些经验。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
幸福在哪儿
1楼-- · 2019-07-28 10:29
加油
幸福在哪儿
2楼-- · 2019-07-28 10:45
不错啊
幸福在哪儿
3楼-- · 2019-07-28 12:12
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-28 12:46
不错,继续加油.
忘月19920216
5楼-- · 2019-07-28 13:27
【2016-03-10】串口配置与基本收发测试
这两天看了比较久串口相关的资料,然后去写程序,只写了简单的测试收发的程序,结果还出了许多问题
1、查看板子电路图,找到串口的两根线分别连到MCU的IO口的哪个引脚;
2、查看原子串口实验例程并理解过程;
3、关掉例程,自己之前的BEEP工程(里面有LED,BEEP功能),并编写串口收发测试程序;
4、仿真调试,思考总结,记录发帖;


1、查看板子电路图,找到串口的两根线分别连到MCU的IO口的哪个引脚;
    精英板:USART1_TX -> GPIOA.9;USART1_RX -> GPIOA.10;
2、查看原子串口实验例程并理解过程;
    相比之前IO口的简单使用,配置的时候,除了要配置IO口外,还需要配置串口;
    串口收发测试程序编写思路:①配置IO口、串口1时钟->②配置IO口、串口1->③不停地收和发(将收到的数据放在一个变量里,不停地发送),并加适当延时(开始没加延时,结果把调试助手卡死了);
3、关掉例程,自己之前的BEEP工程(里面有LED,BEEP功能),并编写串口收发测试程序;
    老套路,写一个初始化函数,对串口及其IO口进行配置,然后在main函数里使用;
    下面是uart.c(这里的库函数对我来说变得有点复杂了,还没学到中断,于是就只是配置了串口基本参数):
[mw_shl_code=applescript,true]#include "uart.h"
#include "stm32f10x.h"


void uart_init(u32 baud)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;

   // 初始化时钟
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE);   // 使能USART1、PA时钟
   
   // 初始化IO口
   // USART1_TX -> GPIOA.9;
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //模式设置为复用推挽输出
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   
   // USART1_RX -> GPIOA.10;
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //模式设置为浮空输入
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   
   // 初始化串口1
   USART_DeInit(USART1);
   USART_InitStructure.USART_BaudRate = baud;   // 波特率
   USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字长:8B
   USART_InitStructure.USART_StopBits = USART_StopBits_1;   // 停止位:1
        USART_InitStructure.USART_Parity = USART_Parity_No;   // 奇偶校验位:无
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  // 硬件流控制:无
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   // 收、发

   USART_Init(USART1, &USART_InitStructure); // 初始化串口1
   USART_Cmd(USART1, ENABLE);    // 使能串口1
  
}   
[/mw_shl_code]
    然后写一个uart.h:
[mw_shl_code=applescript,true]#ifndef __UART_H
#define __UART_H         
#include "sys.h"

void uart_init(u32 baud);
                                                     
#endif
[/mw_shl_code]
    然后在main.c里使用自己配的串口:
[mw_shl_code=applescript,true]#include "stm32f10x.h"
#include "led.h"
#include "beep.h"
#include "uart.h"
#include "delay.h"

int main(void)
{       
   u16 data_buf;
   
   LED_Init();  
   BEEP_Init();
   uart_init(115200);
   delay_init();
   
   LED1 = 0;
   BEEP = 1;
   delay_ms(200);
   LED0 = 0;
   LED1 = 1;
   BEEP = 0;
   
   while(1)
        {
      data_buf = USART_ReceiveData(USART1);
      USART_SendData(USART1,data_buf);
      delay_ms(500);
        }
}[/mw_shl_code]
4、仿真调试,思考总结,记录发帖;

    一开始编译的时候报错提示我串口初始化函数的函数名有问题,“Undefined symbol UART_Init (referred from main.o)”,但是我函数名都是复制的,不会是因为打错,头文件都正常,我又再复制了一边,还是报错,后面看着我自己明明的“UART_Init”函数名跟库函数的“USART_Init”长得这么像,是不是不能用“UART_Init”作为自己的函数名,于是仿照着例程全部用小写“uart_init”,结果就过了,下载后,运行结果是我预想的,但是我发送得比较快,之间没有加延时,把串口调试助手给卡死了,后来加了点延时,就正常了,已证明串口收发功能正常;
    关于函数名“UART_Init”,我又去库函数stm32f10x_usart.c和stm32f10x_usart.h里搜了下,没搜到同名的,还没想通,还没去网上仔细搜,先记着这个问题;
忘月19920216
6楼-- · 2019-07-28 16:13
313668972 发表于 2016-3-9 17:37
难得有这样仔细记录的,坚持下去

谢谢支持,我计划系统地学完STM32(基础部分),同时把每次学习都发帖记录

一周热门 更多>