初级会员

- 积分
- 114
- 金钱
- 114
- 注册时间
- 2019-5-9
- 在线时间
- 29 小时
|
发表于 2019-7-21 17:30:33
|
显示全部楼层
#include "sys.h"
#include "usart5.h"
#include "led.h"
//串口5中断服务程序
u8 USART5_RX_BUF[USART5_REC_LEN]; //接收缓冲,最大USART5_REC_LEN个字节.
//初始化IO 串口1
//bound:波特率
void uart5_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能GPIOD时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);//使能串口5时钟
USART_DeInit(UART5);//复位串口1
//USART5_TX PC.12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//PC.12
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化PC12
//USART5_RX PD.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化PD2
//Usart5 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化VIC寄存器
//USART5 初始化设置
USART_InitStructure.USART_BaudRate = bound;//设置为9600;
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_ITConfig(UART5,USART_IT_IDLE,ENABLE);//开启中断
USART_ClearFlag(UART5, USART_FLAG_RXNE);//清除中断标志位
USART_ClearFlag(UART5, USART_IT_IDLE);//清除中断标志位
USART_Cmd(UART5, ENABLE); //使能串口5
}
u8 count;
u8 Chake[10]={0};//存放传感器数据
u8 flag_State = 0;
#if EN_USART5_RX //如果使能了串口5接收
void UART5_IRQHandler(void)
{
u16 clear=clear;
if (USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)//产生中断
{
while(USART_GetFlagStatus(UART5, USART_FLAG_RXNE) == RESET){}
USART5_RX_BUF[count++] = USART_ReceiveData(UART5);//读取接收到的数据
USART_ClearITPendingBit(UART5,USART_IT_RXNE);
}
if (count == 9 )//接收完成
{
count = 0;
if((USART5_RX_BUF[0]==0x01) && (USART5_RX_BUF[1]==0x03))
{
Chake[4]=USART5_RX_BUF[3];
Chake[5]=USART5_RX_BUF[4];
Chake[6]=USART5_RX_BUF[5];
Chake[7]=USART5_RX_BUF[6];
flag_State = 1;
}
}
if(USART_GetITStatus(UART5,USART_IT_IDLE)!=RESET)//检测到总线空闲
{
clear=UART5->SR;
clear=UART5->DR;
}
}
#endif
//////////////////////////////////////////////////////////////////////////////
上面是串口5的初始化和中断,你只要将问询帧在主函数中发送出去,串口5就能接收到数据了
|
|