| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- /*********************************************************************************************************
- * 模块名称: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
- }
|