您的位置 首页 新能源

STM32的串口通讯

STM32的串口通信在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试…

STM32串口通讯
在根底实验成功的根底上,对串口的调试办法进行实践。硬件代码顺利完结之后,对日后调试需求用到的printf重界说进行调试,固定在自己的库函数中。
b) 初始化函数界说:
void USART_Configuration(void); //界说串口初始化函数
c) 初始化函数调用:
void UART_Configuration(void); //串口初始化函数调用
初始化代码:
void USART_Configuration(void) //串口初始化函数
{
//串口参数初始化
USART_InitTypeDef USART_InitStructure; //串口设置康复默许参数
//初始化参数设置
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;//翻开Rx接纳和Tx发送功用
USART_Init(USART1, &USART_InitStructure); //初始化
USART_Cmd(USART1, ENABLE); //发起串口
}
RCC中翻开相应串口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);
GPIO里边设定相应串口管脚形式
//串口1的管脚初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //管脚9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //TX初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //管脚10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //RX初始化
d) 简略运用:
发送一位字符
USART_SendData(USART1, 数据); //发送一位数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等候发送完毕
接纳一位字符
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){} //等候接纳完毕
变量= (USART_ReceiveData(USART1)); //承受一个字节
发送一个字符串
先界说字符串:char rx_data[250];
然后在需求发送的当地添加如下代码
int i; //界说循环变量
while(rx_data!=\0) //循环逐字输出,到完毕字\0
{USART_SendData(USART1, rx_data); //发送字符
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等候字符发送完毕
i++;}
e) USART留意事项:
发起和承受都需求合作标志等候。
只能对一个字节操作,对字符串等很多数据操作需求写函数
运用串口所需设置:RCC初始化里边翻开RCC_APB2PeriphClockCmd
(RCC_APB2Periph_USARTx);GPIO里边管脚设定:串口RX(50Hz,IN_FLOATING);串口TX(50Hz,AF_PP);
f) printf函数重界说(不必了解,调试经过以备后用)
(1) 需求c规范函数:
#include “stdio.h”
(2) 张贴函数界说代码
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) //界说为putchar运用
(3) RCC中翻开相应串口
(4) GPIO里边设定相应串口管脚形式
(6) 添加为putchar函数。
int putchar(int c) //putchar函数
{
if (c == \n){putchar(\r);} //将printf的\n变成\r
USART_SendData(USART1, c); //发送字符
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等候发送完毕
return c; //返回值
}
(8) 经过,实验成功。printf运用变量输出:%c字符,%d整数,%f浮点数,%s字符串,/n或/r为换行。留意:只能用于main.c中。
3、 NVIC串口中止的运用
a) 意图:运用前面调通的硬件根底,和几个函数的代码,进行串口的中止输入操练。由于在实践运用中,不运用中止进行的输入是功率十分低的,这种用法很少见,大部分串口的输入都离不开中止。
b) 初始化函数界说及函数调用:不必添加和调用初始化函数,在指定调试地址的时分现已调用过,在那个NVIC_Configuration里边添加相应开中止代码就行了。
c) 进程:
i. 在串口初始化中USART_Cmd之前参加中止设置:
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//TXE发送中止,TC传输完结中止,RXNE接纳中止,PE奇偶过错中止,可所以多个。
ii. RCC、GPIO里边翻开串口相应的根本时钟、管脚设置
iii. NVIC里边参加串口中止翻开代码:
NVIC_InitTypeDef NVIC_InitStructure;//中止默许参数
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;//通道设置为串口1中止
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //中止占先等级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中止呼应优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //翻开中止
NVIC_Init(&NVIC_InitStructure); //初始化
iv. 在stm32f10x_it.c文件中找到void USART1_IRQHandler函数,在其间添入履行代码。一般最少三个过程:先运用if句子判别是产生那个中止,然后铲除中止标志位,最终给字符串赋值,或做其他工作。
void USART1_IRQHandler(void) //串口1中止
{
char RX_dat; //界说字符变量
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判别产生接纳中止
{USART_ClearITPendingBit(USART1, USART_IT_RXNE); //铲除中止标志
GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)0x01); //开端传输
RX_dat=USART_ReceiveData(USART1) & 0x7F; //接纳数据,收拾除掉前两位
USART_SendData(USART1, RX_dat); //发送数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}//等候发送完毕
}
}
d) 中止留意事项:
能够随时在程序中运用USART_ITConfig(USART1, USART_IT_TXE, DISABLE);来封闭中止呼应。
NVIC_InitTypeDef NVIC_InitStructure界说一定要加在NVIC初始化模块的榜首句。
全局变量与函数的界说:在恣意.c文件中界说的变量或函数,在其它.c文件中运用extern+界说代码再次界说就能够直接调用了。
STM32笔记之九:打断它来为我就事,EXIT (外部I/O中止)运用
a) 意图:跟串口输入相似,不运用中止进行的IO输入功率也很低,并且能够经过EXTI刺进按钮工作,本节联络EXTI中止。
b) 初始化函数界说:
void EXTI_Configuration(void); //界说IO中止初始化函数
c) 初始化函数调用:
EXTI_Configuration();//IO中止初始化函数调用简略运用:
d) 初始化函数:
void EXTI_Configuration(void)
{ EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构界说
EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);//铲除中止标志
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);//管脚挑选
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//工作挑选
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发形式
EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4; //线路挑选
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//发起中止
EXTI_Init(&EXTI_InitStructure);//初始化
}
e) RCC初始化函数中敞开I/O时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
GPIO初始化函数中界说输入I/O管脚。
//IO输入,GPIOA的4脚输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
f) 在NVIC的初始化函数里边添加以下代码翻开相关中止:
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //呼应级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //发起
NVIC_Init(&NVIC_InitStructure); //初始化
g) 在stm32f10x_it.c文件中找到void USART1_IRQHandler函数,在其间添入履行代码。一般最少三个过程:先运用if句子判别是产生那个中止,然后铲除中止标志位,最终给字符串赋值,或做其他工作。
if(EXTI_GetITStatus(EXTI_Line3) != RESET) //判别中止产生来历
{ EXTI_ClearITPendingBit(EXTI_Line3); //铲除中止标志
USART_SendData(USART1, 0x41); //发送字符“a”
GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2)));//LED产生明暗替换
}
h) 中止留意事项:
中止产生后有必要铲除中止位,不然会呈现死循环不断产生这个中止。然后需求对中止类型进行判别再履行代码。
运用EXTI的I/O中止,在完结RCC与GPIO硬件设置之后需求做三件事:初始化EXTI、NVIC开中止、编写中止履行代码。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/268242.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部