新手上路
- 积分
- 42
- 金钱
- 42
- 注册时间
- 2021-12-23
- 在线时间
- 23 小时
|
25金钱
串口程序:(尝试更改串口引脚取反但会出现乱码)
void USART5_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); //使能USART5 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); //使能GPIOC/D 时钟
USART_DeInit(UART5); //复位串口5
//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_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化PD2
//Usart5 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
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_IDLE, ENABLE);//开启空闲中断
USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//开启接收中断
USART_Cmd(UART5, ENABLE); //使能串口
}
/************************************************************************************************
函数名: Uart5_Send_String
功 能: Uart5发送字符串
输 入: str: 要发送的字符串数组
len: 要发送的数据长度
返 回: 无
************************************************************************************************/
void USART5_Send_String(unsigned char *str)
{
unsigned char i=0; //定义一个局部变量 用来 发送字符串 ++运算
while(str[i]!='\0') // 每个字符串结尾 都是以 \0 结尾的
{
USART_SendData(UART5,str[i]); //通过库函数 发送数据
while( USART_GetFlagStatus(UART5,USART_FLAG_TC)!= SET); //等待发送完成。 检测 USART_FLAG_TC 是否置1;
i++;
}
}
/************************************************************************************************
函数名: USART5_Send_Array
功 能: USART5发送一个数组
输 入: TxData : 要发送的数组
Datalength: 要发送的数据长度
返 回: 无
************************************************************************************************/
void USART5_Send_Array(unsigned char *TxData,unsigned int len)
{
unsigned int i ;
for(i=0; i< len; i++) //循环发送
{
USART_SendData(UART5, TxData[i]); // 发送数据
while(USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET); // 等待发送完成
}
}
/************************************************************************************************
函数名: USART5_ReadFrame
功 能: 读取Uart5接收到的数据
输 入: data: 接收到的数据
返 回: 接收数据的长度
************************************************************************************************/
u16 USART5_ReadFrame( u8 *data,u16 time)
{
u16 i=0;
u16 length=0;
delay_ms(time);
if(USART5_Rx_Finish)
{
USART5_Rx_Finish = 0;
for(i=0;i<Rx5_count;i++)
{
data[i]=USART5_RX_BUF[i];
}
length = Rx5_count;
Rx5_count=0;
GEN_ArrayClear(USART5_RX_BUF,USART5_REC_LEN);
}
return length;
}
/************************************************************************************************/
//USART5中断服务函数
void USART5_IRQHandler(void) //串口5中断服务程序
{
volatile char Res;
volatile u8 temp=0;
if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) //接收中断,可以扩展来控制
{
Res=USART_ReceiveData(UART5); //接收模块的数据;
USART5_RX_BUF[Rx5_count++] =USART_ReceiveData(UART5);//接收模块的数据
if(Rx5_count>=USART5_REC_LEN)
{
Rx5_count=0;
}
}
if(USART_GetITStatus(UART5, USART_IT_IDLE) != RESET) //模块空闲
{
UART5->SR; //先读SR,再读DR才能完成idle中断的清零,否则会一直进入中断。
UART5->DR;
// Res=USART_ReceiveData(USART2); //接收模块的数据;
USART5_Rx_Finish=1;
}
}
|
-
PC12、PD2分别为stm32f103rct6芯片中uart的rx、tx,经过三极管将输出电压从3.3V转换为5V
|