本人以前学过51单片机,知道ARM这个东西后一直向往,最近终于入手一块“战舰V3 精英板”(买板子的时候,没注意看板子资源,看到“精英”二字,以为是STM32F103ZET6板子里面最牛的,而且看价格还不是最贵的,果断买了精英板),经过几天的C语言学习、keil安装及使用学习、Jlink使用学习、工程模板(基于固件库)建立……我的STM32学习终于走上正轨。之前听过别人分享如何学习STM32,其中强调了一点,就是加入一个论坛,在论坛中跟大家一起学习,共同进步,于是今天就开贴(以前水过,从来没发过贴),从零开始学习STM32(以前学过51,但是没了解过STM32,不知道算不算从零开始),记录我的学习历程,记录一个系统性地学习STM32的过程,以求跟坛友共同进步,同时以后传递给别人准备学STM32的人一些经验。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
这两天看了比较久串口相关的资料,然后去写程序,只写了简单的测试收发的程序,结果还出了许多问题;
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里搜了下,没搜到同名的,还没想通,还没去网上仔细搜,先记着这个问题;
谢谢支持,我计划系统地学完STM32(基础部分),同时把每次学习都发帖记录
一周热门 更多>