华大单片机 HC32F460 串口调试
吐槽下,华大官方例程写到太复杂了,不熟练的一时摸不上手.
#include "drvs.h"
#define USART1_BAUDRATE (115200ul)
#define USART1_TX_PORT (PortA)
#define USART1_TX_PIN (Pin09)
#define USART1_RX_PORT (PortA)
#define USART1_RX_PIN (Pin10)
#define UART1_REC_LEN 64
#define USART_COUNTER_9600 3
typedef struct _UART_FLAG_STRUCT
{
uint8_t UART1_Flag;
uint8_t UART1_String[UART1_REC_LEN];
uint8_t UART1_Counter;
uint8_t usart1_start;
uint8_t usart1_counter;
} Uart1_FlagSt;
Uart1_FlagSt Uart1FlagData;
static void Usart1RxIrqCallback(void)
{
if(Uart1FlagData.UART1_Counter<UART1_REC_LEN)
{
Uart1FlagData.UART1_String[Uart1FlagData.UART1_Counter]=USART_RecData(M4_USART1);
Uart1FlagData.UART1_Counter++;
Uart1FlagData.usart1_start=1;
Uart1FlagData.usart1_counter=0;
}else Uart1FlagData.UART1_Counter=0;
}
static void Usart1ErrIrqCallback(void)
{
if (Set == USART_GetStatus(M4_USART1, UsartFrameErr)){ USART_ClearStatus(M4_USART1, UsartFrameErr);}
else{}
if (Set == USART_GetStatus(M4_USART1, UsartParityErr)) {USART_ClearStatus(M4_USART1, UsartParityErr);}
else{}
if (Set == USART_GetStatus(M4_USART1, UsartOverrunErr)) {USART_ClearStatus(M4_USART1, UsartOverrunErr);}
else{}
}
void usart_init(void)
{
en_result_t enRet = Ok;
stc_irq_regi_conf_t stcIrqRegiCfg;
PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_USART1 | PWC_FCG1_PERIPH_USART2 | \
PWC_FCG1_PERIPH_USART3 | PWC_FCG1_PERIPH_USART4, Enable);
PORT_SetFunc(USART1_RX_PORT, USART1_RX_PIN, Func_Usart1_Rx, Disable);
PORT_SetFunc(USART1_TX_PORT, USART1_TX_PIN, Func_Usart1_Tx, Disable);
const stc_usart_uart_init_t stcInitCfg = {
UsartIntClkCkNoOutput,
UsartClkDiv_1,
UsartDataBits8,
UsartDataLsbFirst,
UsartOneStopBit,
UsartParityNone,
UsartSampleBit8,
UsartStartBitFallEdge,
UsartRtsEnable,
};
enRet = USART_UART_Init(M4_USART1, &stcInitCfg);
if (enRet != Ok)while (1);
enRet = USART_SetBaudrate(M4_USART1, USART1_BAUDRATE);
if (enRet != Ok)while (1);
stcIrqRegiCfg.enIRQn = Int000_IRQn;
stcIrqRegiCfg.pfnCallback = &Usart1RxIrqCallback;
stcIrqRegiCfg.enIntSrc = INT_USART1_RI;
enIrqResign(Int000_IRQn);
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
stcIrqRegiCfg.enIRQn = Int001_IRQn;
stcIrqRegiCfg.pfnCallback = &Usart1ErrIrqCallback;
stcIrqRegiCfg.enIntSrc = INT_USART1_EI;
enIrqResign(Int001_IRQn);
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
USART_FuncCmd(M4_USART1, UsartTx, Enable);
USART_FuncCmd(M4_USART1, UsartRx, Enable);
USART_FuncCmd(M4_USART1, UsartRxInt, Enable);
}
void Uart1_SendString(unsigned char *data,unsigned char strlen)
{
unsigned char dataleng;
for(dataleng=0;dataleng<strlen;dataleng++)
{
USART_SendData(M4_USART1,data[dataleng]);
while (Reset == USART_GetStatus(M4_USART1, UsartTxEmpty));
}
}
void UART1_InsetTimer(void)
{
if(Uart1FlagData.usart1_start==1)
{
Uart1FlagData.usart1_counter++;
if(Uart1FlagData.usart1_counter>USART_COUNTER_9600)
{
Uart1FlagData.UART1_Flag=1;
Uart1FlagData.usart1_counter=0;
Uart1FlagData.usart1_start=0;
}
}
}
void USART_CS(void)
{
if(Uart1FlagData.UART1_Flag==1)
{
Uart1FlagData.UART1_Flag=0;
Uart1_SendString(Uart1FlagData.UART1_String,Uart1FlagData.UART1_Counter);
Uart1FlagData.UART1_Counter=0;
}
}
int uart_1_w(int fd,void *buf,int len)
{
if(len>0 && len<=128)
{
Uart1_SendString(buf,len);
return len;
}
return -1;
}
int uart_1_r(int fd,void *buf,int len)
{
if(Uart1FlagData.UART1_Flag==1)
{
int uart =0;
Uart1FlagData.UART1_Flag=0;
char * data =(char *)buf;
memcpy(data,Uart1FlagData.UART1_String,Uart1FlagData.UART1_Counter);
uart =Uart1FlagData.UART1_Counter;
Uart1FlagData.UART1_Counter = 0;
return uart;
}
return -1;
}
void USART1_INIT_YUN(void)
{
usart_init();
rxm_reg_w(DEV_UART1,&uart_1_w);
rxm_reg_r(DEV_UART1,&uart_1_r);
rxm_addtim(60,&USART_CS);
}
DRV_INIT(USART1_INIT_YUN);
总结:管脚设置和STM32不同 需注意
/* Initialize USART IO */ /*配置相应的IO作为串口的TX,RX引脚*/
PORT_SetFunc(USART1_RX_PORT, USART1_RX_PIN, Func_Usart1_Rx, Disable);
PORT_SetFunc(USART1_TX_PORT, USART1_TX_PIN, Func_Usart1_Tx, Disable);
初始化要一句一句写 需要注意
/*Enable RX && RX interupt function && UsartTx*/
USART_FuncCmd(M4_USART1, UsartRx, Enable);//使能接收
USART_FuncCmd(M4_USART1, UsartRxInt, Enable);//使能接收中断
USART_FuncCmd(M4_USART1, UsartTx, Enable);//使能发送
系统时钟较高时需要调节分频系数需要注意
|