三、硬件驱动函数
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;
}
}
|