/********************************************************************************************************* * 模块名称:Uart1.c * 摘 要:串口模块,包括串口模块初始化,以及中断服务函数处理,以及读写串口函数实现 * 当前版本:1.0.0 * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.) * 完成日期:2021年07月01日 * 内 容: * 注 意: ********************************************************************************************************** * 取代版本: * 作 者: * 完成日期: * 修改内容: * 修改文件: *********************************************************************************************************/ /********************************************************************************************************* * 包含头文件 *********************************************************************************************************/ #include "Uart1.h" #include "IM1253E.h" #include "board_cnf.h" #include "Main.h" /********************************************************************************************************* * 宏定义 *********************************************************************************************************/ /********************************************************************************************************* * 枚举结构体 *********************************************************************************************************/ /********************************************************************************************************* * 内部变量定义 *********************************************************************************************************/ bool Rx_Finish_flag; uint8_t Rx_Data_buff_IM1253E[UART1_BUF_SIZE] = {0}; uint8_t TX_Length; uint8_t RX_Length; uint8_t RX_Index; uint8_t Rx_Data_len; extern bool read_IM1253E_ok_flag; extern bool write_IM1253E_ok_flag; extern uint8_t W_R_reg_N; /********************************************************************************************************* * 内部函数声明 *********************************************************************************************************/ /********************************************************************************************************* * 内部函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称:USART1_IRQHandler * 函数功能:USART1中断服务函数 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void USART1_IRQHandler(void) { if(usart_flag_get(USART1, USART_FLAG_ORERR) == SET) //溢出错误标志为1 { usart_flag_clear(USART1, USART_FLAG_ORERR); //清除溢出错误标志 } if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_TBE)!= RESET) //发送缓冲区空中断 { usart_interrupt_flag_clear(USART1, USART_INT_FLAG_TBE); //清除发送中断标志 } // if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_TC)!= RESET) //发送完成中断 // { // usart_interrupt_flag_clear(USART1, USART_INT_FLAG_TC); //清除发送完成中断 //// gpio_bit_reset(GPIOA, GPIO_PIN_8); //接收 // } if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET) //接收缓冲区非空中断 { usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE); //清除USART1中断挂起 #if SUPPORT_STM32_ADC extern Rx_Data data; data.data[RX_Index] = usart_data_receive(USART1); #else Rx_Data_buff_IM1253E[RX_Index] = usart_data_receive(USART1); #endif RX_Index++; if(RX_Index >= RX_Length)//接收完成 { RX_Index = 0; Rx_Finish_flag = true; } /* if(RX_Index > 1) { RX_Index++; if(Rx_Data_buff_IM1253E[1] == cmd_read_IM1253E)//读命令后返回 { if(Rx_Data_buff_IM1253E[1] == Rx_Data_len) { if(RX_Index >= RX_Length)//接收完成 { RX_Index = 0; Rx_Finish_flag = true; } } else//读数据数量和返回数量不对应 { RX_Index = 0; } } else//写命令后返回 { if(Rx_Data_buff_IM1253E[1] == Rx_Data_len) { if(RX_Index > RX_Length)//接收完成 { RX_Index = 0; Rx_Finish_flag = true; } } else//写数据数量和返回数量不对应 { RX_Index = 0; } } } else if(RX_Index > 0) { if((Rx_Data_buff_IM1253E[RX_Index] == cmd_read_IM1253E) || (Rx_Data_buff_IM1253E[RX_Index] == cmd_write_IM1253E)) { RX_Index++; } else { RX_Index = 0; Rx_Finish_flag = false; } } else { if(Rx_Data_buff_IM1253E[RX_Index] == Device_addr_IM1253E) { RX_Index++; } else { RX_Index = 0; Rx_Finish_flag = false; } } */ } } /********************************************************************************************************* * API函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称:InitUART0 * 函数功能:初始化UART模块 * 输入参数:bound,波特率 * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void InitUART1(uint32_t bound) { nvic_irq_enable(USART1_IRQn, 2); //使能串口中断,设置优先级 rcu_periph_clock_enable(RCU_GPIOA); //使能GPIOA时钟 //配置TX的GPIO gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2); //复用PA2 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2); //配置RX的GPIO gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3); //复用PA3 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3); //配置USART的参数 rcu_periph_clock_enable(RCU_USART1); //使能串口时钟 usart_deinit(USART1); //RCU配置恢复默认值 usart_baudrate_set(USART1, bound); //设置波特率 usart_stop_bit_set(USART1,USART_STB_1BIT); //设置停止位 usart_word_length_set(USART1,USART_WL_8BIT); //设置数据字长度 usart_parity_config(USART1,USART_PM_NONE); //设置奇偶校验位,偶校验 usart_receive_config(USART1, USART_RECEIVE_ENABLE); //使能接收 usart_transmit_config(USART1, USART_TRANSMIT_ENABLE); //使能发送 usart_enable(USART1); //使能串口 usart_interrupt_enable(USART1, USART_INT_RBNE); //使能接收缓冲区非空中断 } /********************************************************************************************************* * 函数名称:Start_Send_UartData * 函数功能:发送数据函数 * 输入参数:发送数据长度 * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void Start_Send_UartData(uint8_t *pt,uint8_t len) { uint8_t i; for(i = 0;i < len;i++) { usart_data_transmit(USART1, *(pt+i)); //发送字符函数 while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);//等待发送结束 } } /********************************************************************************************************* * 函数名称:fputc * 函数功能:重定向函数 * 输入参数:ch,f * 输出参数:void * 返 回 值:int * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ int fputc(int ch, FILE *f) { usart_data_transmit(USART1, (uint8_t) ch); //发送字符函数,专由fputc函数调用 while(RESET == usart_flag_get(USART1, USART_FLAG_TBE)); return ch; //返回ch }