[STM32F1] STM32基础篇 ——232串口通信实验

[复制链接]
 楼主| aizaixiyuanqian 发表于 2017-12-11 22:12 | 显示全部楼层 |阅读模式
本帖最后由 aizaixiyuanqian 于 2017-12-11 22:13 编辑

这次实验我们将学习 STM32 的串口,如何使用 STM32 的串口来发送和接收数据。 本次实验实现如下功能:STM32 通过串口和上位机通讯,STM32收到上位机发过来的符串后,返回给上位机收到的字符串。
 楼主| aizaixiyuanqian 发表于 2017-12-11 22:15 | 显示全部楼层
串口的操作步骤:1) 打开 GPIO 的时钟使能和 USART 的时钟使能。
2) 设置串口 IO 的 IO 口模式。 (模拟输入, 复用推挽输出)
3) 初始化 USART。 (波特率、数据长度、停止位、效验位等)
4) 如果使用中断接收的话,那么还要设置 NVIC 并打开中断使能。( 设置它的中断优先级。 )



 楼主| aizaixiyuanqian 发表于 2017-12-11 22:20 | 显示全部楼层
串口库函数说明1.RCC_APB2PeriphClockCmd() 函数
2) GPIO_Init()   GPIO初始化
3)USART_Init() 函数  串口初始化
4)USART_Cmd() 函数  串口使能函数
5)NVIC_Init(&NVIC_InitStructure) 函数  用来设置中断的优先级和打开总中断
6)USART_SendData() 函数  发送数据
7) USART_GetFlagStatus() 函数  检测状态的函数
8) USART_ITConfig()  打开 USART 中断的函数
9) USART_ReceiveData() 函数 串口接收数据函数









 楼主| aizaixiyuanqian 发表于 2017-12-11 22:21 | 显示全部楼层
串口初始化函数
void usart_init()
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化 GPIO
USART_InitTypeDef USART_InitStructure; //串口结构体定义
NVIC_InitTypeDef NVIC_InitStructure;//中断结构体定义
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //打开时钟
/* 配置 GPIO 的模式和 IO 口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX //串口输出 PA9
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化串口输入 IO */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX //串口输入 PA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;  //模拟输入
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化 GPIO */
USART_InitStructure.USART_BaudRate=9600; //波特率设置为 9600 //波特率
USART_InitStructure.USART_WordLength=USART_WordLength_8b; //数据长 8 位
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); /* 初始化 USART1 */
USART_Cmd(USART1, ENABLE);  /* 使能 USART1 */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能或者失能指定的USART中断 接收中断
USART_ClearFlag(USART1,USART_FLAG_TC);//清除 USARTx 的待处理标志位
/* 设置 NVIC 参数 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //打开 USART1 的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}

 楼主| aizaixiyuanqian 发表于 2017-12-11 22:22 | 显示全部楼层
串口接收函数   //回显
void USART1_IRQHandler(void)  //串口 1 中断函数
{
static u8 k;
USART_ClearFlag(USART1,USART_FLAG_TC);
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)//检查指定的 USART 中断发生
与否
{
k=USART_ReceiveData(USART1);
USART_SendData(USART1,k);//通过外设 USARTx 发送单个数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==Bit_RESET);
}
}

 楼主| aizaixiyuanqian 发表于 2017-12-11 22:23 | 显示全部楼层
主函数部分
int main()
{
usart_init();//串口 1 初始化
while(1);
}
设置串口波特率为 9600,在串口助手可以观察到现象。
 楼主| aizaixiyuanqian 发表于 2017-12-11 22:24 | 显示全部楼层
有关于串口1的应用我们到后面会再详细讲解,今天就到这里了。
 楼主| aizaixiyuanqian 发表于 2017-12-11 22:25 | 显示全部楼层
欢迎大家来学习指正,加油,**。
三大学生1 发表于 2017-12-22 09:49 | 显示全部楼层
用到的函数给了出来很好
sdCAD 发表于 2017-12-22 16:26 | 显示全部楼层
fengm 发表于 2017-12-22 16:27 | 显示全部楼层
aizaixiyuanqian 发表于 2017-12-11 22:21
串口初始化函数
void usart_init()
{

注释的非常详细。
pl202 发表于 2017-12-22 16:27 | 显示全部楼层
这个是STM32哪个芯片?
mmbs 发表于 2017-12-22 16:28 | 显示全部楼层
最基本入门的教程。
sdCAD 发表于 2017-12-22 16:29 | 显示全部楼层
aizaixiyuanqian 发表于 2017-12-11 22:23
主函数部分
int main()
{

提供一个完成的工程代码。
fengm 发表于 2017-12-22 16:29 | 显示全部楼层
aizaixiyuanqian 发表于 2017-12-11 22:21
串口初始化函数
void usart_init()
{

可以配合硬件电路图来讲解。
pl202 发表于 2017-12-22 16:29 | 显示全部楼层
现在的STM32Cube都可以直接配置了。
mmbs 发表于 2017-12-22 16:29 | 显示全部楼层
没有仿真器,可以通过串口进行调试。
heisexingqisi 发表于 2017-12-24 07:11 来自手机 | 显示全部楼层
学习了,等我下载验证一下
 楼主| aizaixiyuanqian 发表于 2017-12-26 19:23 | 显示全部楼层
heisexingqisi 发表于 2017-12-24 07:11
学习了,等我下载验证一下

好的,欢迎指正
 楼主| aizaixiyuanqian 发表于 2017-12-26 19:24 | 显示全部楼层
mmbs 发表于 2017-12-22 16:29
没有仿真器,可以通过串口进行调试。

可以买一个,也不算贵吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部

62

主题

1353

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部