历史上的今天
今天是:2025年01月07日(星期二)
2019年01月07日 | STM32F103RCT6+USART3+UART5初始化代码
2019-01-07 来源:eefocus
USART和UART的区别就是:USART支持同步收发,UART只支持异步收发
同步模式:USART 需要同步始终信号USART_CK,通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。
1>USART3初始化
void USART3_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能USART3,GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能USART3,GPIOB时钟
USART_DeInit(USART3); //复位串口3
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化Pb10
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = 115200;//一般设置为115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_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(USART3, &USART_InitStructure); //初始化串口
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启USART3接收中断
USART_Cmd(USART3, ENABLE); //使能串口
}
USART3接收中断服务程序
//串口3中断服务程序
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收中断
{
USART3_RX_BUF[0]=USART3->DR;//读取接收到的数据;
}
}
USART3发送函数
void UART3_SendOneByte(u8 dat)
{
while((USART3->SR&0X40)==0) {}; //循环发送,直到发送完毕
USART3->DR = (u8) dat;
}
USART1/2/3代码几乎差不多,注意TXD、RXD引脚的初始化即可!
2>UART5初始化代码
注意NVIC中断通道是: UART5_IRQn
void UART5_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); //使能UART5,GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); //使能
GPIOC/D时钟
USART_DeInit(UART5); //复位串口5
//USART5_TX PC12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PC12
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC12
//USART5_RX PD2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化PB11
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = USART3Baud;//一般设置为;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_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(UART5, &USART_InitStructure); //初始化串口
USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//开启中断
USART_Cmd(UART5, ENABLE); //使能串口
}
UART5中断服务程序
void UART5_IRQHandler(void)
{
if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)//接收中断
{
USART3_RX_BUF[0]=UART5->DR;//读取接收到的数据;
}
}
按照如上配置后
出现无法发送或者接收数据,请仔细检查串口的TXD、RXD引脚是否在其他地方被使用,比如我的串口5的RX引脚PD2就作为了
AT24C02的SCL线,导致无法接收数据
史海拾趣
|
奇怪,我的VS2005找得到WINCE5模拟器,却启动不成功。WINCE5模拟器是完全安装VS2005是装上去的。 奇怪,我的VS2005在模拟器管理里找得到WINCE5模拟器,却启动不成功。WINCE5模拟器是完全安装VS2005是装上去的。… 查看全部问答> |
|
现在想把wince5 模拟成U盘,用了wince5的源码usbfn,storage目录中。 注册表也做了相应的改动,现在pc机已经能够识别出Upan。 可是在通信过程中,PC机老是会发 0x23指令,而次指令并不支持。导致reset。 在网上查到: 一个U盘插上,Windows要连 ...… 查看全部问答> |
|
请教大家一个线程的切换问题:请高手们指点指点 在我的程序中用到好几个线程,而且在线程中频繁用到SLEEP()延时函数, 这样可能会造成线程间的频繁切换,可能会使软件的运行效率降低, 我想知道两个线程之间的切换需要多少时间 ...… 查看全部问答> |
|
请问下大家,比如我在做一个项目,想把一些数据存储在flash当中的一个扇区里,但是如果这个扇区损坏了,除了备份以外我们怎么做才能保证数据不丢失或仍然可用呢?软件或硬件的方法都可以,大家帮忙讨论下,谢谢大家… 查看全部问答> |
|
SOIC窄体16PIN1.27mm脚距,这种封装在元件库里焊盘一般宽和长是多少? SOIC窄体16PIN1.27mm脚距,这种封装在元件库里焊盘一般宽和长是多少? 在orcad中发现宽有0.6mm,长竟然有2.5mm。 焊盘的画法是否有相应的标准来参照啊… 查看全部问答> |
|
timing toggle active inactive四种模式有什么区别 比较匹配时,输出管脚可以保持它的电平(OCxM=000)、 被设置成有效电平(OCxM=001)、 ?? 被设置成无有效电平(OCxM=010) ? ? 或进行翻转 ...… 查看全部问答> |
|
转载的:(http://blog.163.com/qhrong718@126/blog/static/882427522011024567513/?fromdm&isFromSearchEngine=yes) 一,滤波电路中使用的片式钽电容器的性能选择 滤波电路是片式钽和氧化铌电容器最常用电路, 电容 ...… 查看全部问答> |




