完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、实验原理
简单串口通信实例 1、串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能,GPIO时钟使能 2) 串口复位 3) GPIO端口模式设置 4) 串口参数初始化 5) 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) 6) 使能串口 7) 编写中断处理函数 2、具体函数实现 1)串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd(); //①串口时钟使能,GPIO时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口1时钟使能 2)GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF_PP和GPIO_Mode_IN_FLOATING //②TX GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//查中文手册,串口需要配置的模式 GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9; GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue);//GPIO端口模式设置 //②RX GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue);//GPIO端口模式设置 3)串口参数初始化:USART_Init(); //③串口参数初始化 USART_InitStrue.USART_BaudRate=115200;//波特率 USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流 USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//收发模式都打开 USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验 USART_InitStrue.USART_StopBits=USART_StopBits_1;//停止位 USART_InitStrue.USART_WordLength=USART_WordLength_8b;//字长8 USART_Init(USART1,&USART_InitStrue); 4)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) NVIC_Init(); USART_ITConfig(); //④ USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//④开启接收中断!!!! NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;;//串口1中断 NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;// 抢占优先级为1 NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//子优先级位1 NVIC_Init(&NVIC_InitStrue);//④中断初始化函数 5)使能串口:USART_Cmd(); //⑤使能串口 USART_Cmd(USART1,ENABLE); 6)编写中断处理函数:USARTx_IRQHandler(); 7)串口数据收发: void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据 //自己编写的中断处理函数(SYSTEM中重复定义了)⑥ void USART1_IRQHandler(void) { u8 res; if(USART_GetITStatus(USART1,USART_IT_RXNE))//判断是否有接受中断! { //串口数据收发函数⑦ res= USART_ReceiveData(USART1); USART_SendData(USART1,res); } } 8)串口传输状态获取(暂未用到): FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); 3、使用中文手册查串口需要配置的GPIO模式 二、实验代码 **main.c** #include "stm32f10x.h" void My_USART1_Init(void)//自己写的简单串口初始化函数,可以把单独个uart.c { //2、3、4定义结构体指针 GPIO_InitTypeDef GPIO_InitStrue; USART_InitTypeDef USART_InitStrue; NVIC_InitTypeDef NVIC_InitStrue; //①串口时钟使能,GPIO时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口1时钟使能 //②TX GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//查中文手册,串口需要配置的模式 GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9; GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue);//GPIO端口模式设置 //②RX GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue);//GPIO端口模式设置 //③串口参数初始化 USART_InitStrue.USART_BaudRate=115200;//波特率 USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流 USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//收发模式都打开 USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验 USART_InitStrue.USART_StopBits=USART_StopBits_1;//停止位 USART_InitStrue.USART_WordLength=USART_WordLength_8b;//字长8 USART_Init(USART1,&USART_InitStrue); //⑤使能串口 USART_Cmd(USART1,ENABLE); //④ USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//④开启接收中断!!!! NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;;//串口1中断 NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;// 抢占优先级为1 NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//子优先级位1 NVIC_Init(&NVIC_InitStrue);//④中断初始化函数 } //自己编写的中断处理函数(SYSTEM中重复定义了)⑥ void USART1_IRQHandler(void) { u8 res; if(USART_GetITStatus(USART1,USART_IT_RXNE))//判断是否有接受中断! { //串口数据收发函数⑦ res= USART_ReceiveData(USART1); USART_SendData(USART1,res); } } int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组函数 My_USART1_Init(); while(1);//等待中断 } 三、实验结果 需要串口助手中的配置与初始化的一致 //串口参数初始化 USART_InitStrue.USART_BaudRate=115200;//波特率 USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流 USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//收发模式都打开 USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验 USART_InitStrue.USART_StopBits=USART_StopBits_1;//停止位 USART_InitStrue.USART_WordLength=USART_WordLength_8b;//字长8 USART_Init(USART1,&USART_InitStrue); |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1376 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1368 浏览 1 评论
791 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
568 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1410 浏览 2 评论
1762浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
489浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
422浏览 3评论
415浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
391浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-30 17:23 , Processed in 1.007740 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号