三、硬件驱动函数
- static void InitHardUsart(void)
- {
- /* 第1步:打开GPIO和USART部件的时钟 */
- rcu_periph_clock_enable(RCU_GPIOA);
- rcu_periph_clock_enable(RCU_USART1);
- /* 第2步:将USART Tx的GPIO配置为推挽复用模式 */
- gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_2);
-
- /* 第3步:将USART Rx的GPIO配置为浮空输入模式
- 由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的
- 但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数
- */
- gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_3);
-
-
- /* 第4步: 配置串口硬件参数 */
- usart_baudrate_set(USART1,USART1_BAUD);
- usart_parity_config(USART1,USART_PM_NONE);
- usart_stop_bit_set(USART1,USART_STB_1BIT);
- usart_word_length_set(USART1,USART_WL_8BIT);
- usart_transmit_config(USART1,USART_TRANSMIT_ENABLE);
- usart_receive_config(USART1,USART_RECEIVE_ENABLE);
- usart_hardware_flow_cts_config(USART1,USART_CTS_DISABLE);
- usart_hardware_flow_rts_config(USART1,USART_RTS_DISABLE);
- usart_interrupt_enable(USART1,USART_INT_RBNE); /* 使能接收中断 */
- /*
- USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
- 注意: 不要在此处打开发送中断
- 发送中断使能在SendUart()函数打开
- */
- usart_enable(USART1); /* 使能串口 */
- /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
- 如下语句解决第1个字节无法正确发送出去的问题 */
- usart_interrupt_flag_clear(USART1,USART_INT_FLAG_TC); /* 清发送完成标志,Transmission Complete flag */
- }
- /**
- * 函数功能: 配置NVIC,设定USART接收中断优先级.
- * 输入参数: 无
- * 返 回 值: 无
- * 说 明:无
- */
- static void NVIC_Configuration_USART(void)
- {
-
- /* 使能串口1中断 */
- nvic_irq_enable(USART1_IRQn,2,2);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: RS485_InitTXE
- * 功能说明: 配置RS485发送使能口线 TXE
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void RS485_InitTXEN(void)
- {
- rcu_periph_clock_enable(RCU_GPIOA);
- gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: RS485_SendBefor
- * 功能说明: 发送数据前的准备工作。对于RS485通信,请设置RS485芯片为发送状态,
- * 并修改 UartVarInit()中的函数指针等于本函数名,比如 g_tUart2.SendBefor = RS485_SendBefor
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void RS485_SendBefor(void)
- {
- RS485_TX_EN(); /* 切换RS485收发芯片为发送模式 */
- }
- /*
- *********************************************************************************************************
- * 函 数 名: RS485_SendOver
- * 功能说明: 发送一串数据结束后的善后处理。对于RS485通信,请设置RS485芯片为接收状态,
- * 并修改 UartVarInit()中的函数指针等于本函数名,比如 g_tUart2.SendOver = RS485_SendOver
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void RS485_SendOver(void)
- {
- RS485_RX_EN(); /* 切换RS485收发芯片为接收模式 */
- }
- /*
- *********************************************************************************************************
- * 函 数 名: RS485_SendBuf
- * 功能说明: 通过RS485芯片发送一串数据。注意,本函数不等待发送完毕。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void RS485_SendBuf(uint8_t *_ucaBuf, uint16_t _usLen)
- {
- switch(USART_SELECT_NUM)
- {
- case 1:
- {
- comSendBuf(COM1, _ucaBuf, _usLen);
- }break;
- case 2:
- {
- comSendBuf(COM2, _ucaBuf, _usLen);
- }break;
- case 3:
- {
- comSendBuf(COM3, _ucaBuf, _usLen);
- }break;
- default:
- {
-
- }break;
- }
- }
|