天天看點

☆ 華大HC32F003☆ ---UART例程分享(不斷更新中......)

☆ HC32F003 系列是一款 Low Pin Count、寬電壓工作範圍的 MCU。內建 12 位 1M sps 高精度SARADC 以及內建了比較器,多路 UART,SPI,I2C 等豐富的通訊外設,具有高整合度、高抗幹擾、高可靠性的特點。HC32F003 核心采用 Cortex-M0+ 核心,配合成熟的 Keil μVision 調試開發軟體,支援 C 語言及彙編語言,彙編指令。

☆适用領域:小家電,充電器,重合閘,遙控器,電子煙,瓦斯報警器,數顯表,溫控器,記錄儀等行業。☆ 本文旨在抛磚引玉,其餘具體使用歡迎加Q:3254478211或加群164973950互相交流、學習。

☆ 華大MCU單片機資料分享連接配接

HC32F003 HC32F005 HC32L110 HC32L136 HC32F030 HC32M140 HC32F146 HC32L150 HC32L156

作者:虹芯俠客1

來源:CSDN

原文:https://blog.csdn.net/jetson024/article/details/84619088

版權聲明:本文為部落客原創文章,轉載請附上博文連結!

樣例使用說明
           

#include “ddl.h”

#include “uart.h”

#include “bt.h”

#include “lpm.h”

#include “gpio.h”

//uint8_t u8TxData[10] = {0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00};//“HUADA MCU!”;

uint8_t u8TxData[10] = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};

uint32_t u32RxData[10];

uint8_t u8TxCnt=0,u8RxCnt=0;

void TxIntCallback(void)

{

if(u8TxCnt<10)
{
    M0P_UART1->SBUF = u32RxData[u8TxCnt];
    u8TxCnt++;
}
else //if(u8TxCnt>10)
{
    u8TxCnt = 0;
    Uart_ClrStatus(UARTCH1,UartTxEmpty);   
    Uart_DisableIrq(UARTCH1,UartTxIrq);
    Uart_EnableIrq(UARTCH1,UartRxIrq);
}
           

}

void RxIntCallback(void)

{

u32RxData[u8RxCnt]=Uart_ReceiveData(UARTCH1);

u8RxCnt++;

if(u8RxCnt>=10)

{

Uart_DisableIrq(UARTCH1,UartRxIrq);

Uart_EnableIrq(UARTCH1,UartTxIrq);

u8RxCnt = 0;

M0P_UART1->SBUF = u32RxData[0];

u8TxCnt = 1;

}

}

void ErrIntCallback(void)

{

}

int32_t main(void)

{

uint16_t timer;

uint32_t pclk;

stc_clk_config_t stcCfg;

stc_uart_config_t stcConfig;

stc_uart_irq_cb_t stcUartIrqCb;

stc_uart_multimode_t stcMulti;

stc_uart_baud_config_t stcBaud;

stc_bt_config_t stcBtConfig;

stc_lpm_config_t stcLpmCfg;

en_uart_mmdorck_t enTb8;

DDL_ZERO_STRUCT(stcConfig);
DDL_ZERO_STRUCT(stcUartIrqCb);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcBaud);
DDL_ZERO_STRUCT(stcBtConfig);
DDL_ZERO_STRUCT(stcLpmCfg);

stcLpmCfg.enSLEEPDEEP = SlpDpDisable;

//時鐘部配置設定置
stcCfg.enClkSrc = ClkXTH;
stcCfg.enHClkDiv = ClkDiv1;
stcCfg.enPClkDiv = ClkDiv1;
Clk_Init(&stcCfg);

Gpio_InitIO(T1_PORT,T1_PIN,GpioDirIn); 
Gpio_InitIO(0,3,GpioDirOut);
Gpio_SetIO(0,3,1);

Gpio_InitIOExt(3,5,GpioDirOut,TRUE,FALSE,FALSE,FALSE);   
Gpio_InitIOExt(3,6,GpioDirOut,TRUE,FALSE,FALSE,FALSE); 

//通道端口配置
Gpio_SetFunc_UART1TX_P35();
Gpio_SetFunc_UART1RX_P36();

//外設時鐘使能
Clk_SetPeripheralGate(ClkPeripheralBt,TRUE);//模式0/2可以不使能
Clk_SetPeripheralGate(ClkPeripheralUart1,TRUE);



stcUartIrqCb.pfnRxIrqCb = RxIntCallback;
stcUartIrqCb.pfnTxIrqCb = TxIntCallback;
stcUartIrqCb.pfnRxErrIrqCb = ErrIntCallback;
stcConfig.pstcIrqCb = &stcUartIrqCb;
stcConfig.bTouchNvic = TRUE;


stcConfig.enRunMode = UartMode1;//測試項,更改此處來轉換4種模式測試


stcMulti.enMulti_mode = UartNormal;//測試項,更改此處來轉換多主機模式,mode2/3才有多主機模式
enTb8 = DataOrEven;
Uart_SetMMDOrCk(UARTCH1,enTb8);
stcConfig.pstcMultiMode = &stcMulti;
           

#if 1

stcBaud.bDbaud = 0u;//雙倍波特率功能

stcBaud.u32Baud = 2400u;//更新波特率位置

stcBaud.u8Mode = UartMode1; //計算波特率需要模式參數

pclk = Clk_GetPClkFreq();

timer=Uart_SetBaudRate(UARTCH1,pclk,&stcBaud);

stcBtConfig.enMD = BtMode2;
stcBtConfig.enCT = BtTimer;
Bt_Init(TIM1, &stcBtConfig);//調用basetimer1設定函數産生波特率
Bt_ARRSet(TIM1,timer);
Bt_Cnt16Set(TIM1,timer);
Bt_Run(TIM1);
           

#endif

Uart_Init(UARTCH1, &stcConfig);

Uart_EnableIrq(UARTCH1,UartRxIrq);

Uart_ClrStatus(UARTCH1,UartRxFull);

Uart_EnableFunc(UARTCH1,UartRx);

#if 0 //休眠模式測試

while(1 == Gpio_GetIO(T1_PORT,T1_PIN));//注意:如果使用者修改進入深度休眠的話,此處不能屏蔽

Lpm_Config(&stcLpmCfg);

Lpm_GotoLpmMode();

Gpio_SetIO(0,3,0);

#endif

while(1);

}

繼續閱讀