华大芯片HC32L1110的DDL

1,串口的初始化和使用

void Uart0_Init(void)
{
    uint16_t timer=0;
    uint32_t pclk=0;

    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;//基础定时器配置结构体


    DDL_ZERO_STRUCT(stcUartIrqCb);//清空数据函数
    DDL_ZERO_STRUCT(stcMulti);
    DDL_ZERO_STRUCT(stcBaud);
    DDL_ZERO_STRUCT(stcBtConfig);



    Gpio_InitIOExt(0,1,GpioDirOut,FALSE,FALSE,FALSE,TRUE); //配置01引脚为输入模式RX
    Gpio_InitIOExt(0,2,GpioDirOut,FALSE,FALSE,FALSE,TRUE);//配置02引脚为输出模式TX

    //通道端口配置
    Gpio_SetFunc_UART0_RXD_P01();//RX输入	
    Gpio_SetFunc_UART0_TXD_P02();//TX输出

    //外设时钟使能
    Clk_SetPeripheralGate(ClkPeripheralBt,TRUE);//模式0/2可以不使能
    Clk_SetPeripheralGate(ClkPeripheralUart0,TRUE);//使能串口时钟



    stcUartIrqCb.pfnRxIrqCb = RxIntCallback;//设置接收中断函数
    stcUartIrqCb.pfnTxIrqCb = NULL;//设置发送中断为空
    stcUartIrqCb.pfnRxErrIrqCb = ErrIntCallback;//设置接收错误中断函数
    stcConfig.pstcIrqCb = &stcUartIrqCb;//将中断函数结构体指针赋值给串口配置
    stcConfig.bTouchNvic = TRUE;//NVIC中断控制器使能标志


    stcConfig.enRunMode = UartMode1;//测试项,更改此处来转换4种模式测试


    //stcMulti.enMulti_mode = UartNormal;//测试项,更改此处来转换多主机模式,mode2/3才有多主机模式

    stcConfig.pstcMultiMode = &stcMulti;//将中断回调函数结构体指针赋值给串口配置结构体

    stcBaud.bDbaud = 0u;//不使能
    stcBaud.u32Baud = 9600u;//设置波特率为9600bps
    stcBaud.u8Mode = UartMode1; //计算波特率需要模式参数
    pclk = Clk_GetPClkFreq();//获取外设始终频率
    timer=Uart_SetBaudRate(UARTCH0,pclk,&stcBaud);//计算波特率对应得定时器

    stcBtConfig.enMD = BtMode2;//基础定时器模式为Mode2
    stcBtConfig.enCT = BtTimer;//基础定时器工作在定时器模式
    Bt_Init(TIM0, &stcBtConfig);//调用basetimer0设置函数产生波特率
    Bt_ARRSet(TIM0,timer);//设计基础定时器0得自动重载值
    Bt_Cnt16Set(TIM0,timer);//设置基础定时器0得计数值
    Bt_Run(TIM0);//启动基础定时器0

    Uart_Init(UARTCH0, &stcConfig);//初始化串口0
    Uart_EnableIrq(UARTCH0,UartRxIrq);//使能串口0中断
    Uart_ClrStatus(UARTCH0,UartRxFull);//清除缓冲区满标志
    Uart_EnableFunc(UARTCH0,UartRx);//使能串口0接收功能
}

2,RTC的初始化和使用

cs 复制代码
void rtc_Init(void)
{
	stc_rtc_config_t stcRtcConfig;//定义RTC结构体 
    stc_rtc_irq_cb_t stcIrqCb;//定义RTC中断回调函数结构体
    stc_rtc_time_t  stcTime;//RTC时间结构体
    stc_rtc_alarmset_t stcAlarm;//RTC闹钟设置结构体
    stc_rtc_cyc_sel_t   stcCycSel;//RTC定时周期结构体
    
    
    DDL_ZERO_STRUCT(stcRtcConfig);//清空数据函数
    DDL_ZERO_STRUCT(stcIrqCb);
    DDL_ZERO_STRUCT(stcAlarm);
    DDL_ZERO_STRUCT(stcTime);
    DDL_ZERO_STRUCT(stcCycSel);
    DDL_ZERO_STRUCT(stcLpmCfg);
    
    stcLpmCfg.enSLEEPDEEP = SlpDpEnable;//使能深度睡眠
    stcLpmCfg.enSLEEPONEXIT = SlpExtEnable;//在退出中断时进入睡眠
    
//    Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟
//	Gpio_InitIO(T1_PORT,T1_PIN,GpioDirOut);//初始化IO口为输出
//    Gpio_SetIO(T1_PORT,T1_PIN,1);
//    Gpio_InitIO(3,3,GpioDirIn);
    
    Clk_Enable(ClkRCL, TRUE);//开启内部晶振   
    Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟
    
    stcRtcConfig.enClkSel = RtcClk32;//RTC时钟选择为内部RTC
    stcRtcConfig.enAmpmSel = Rtc24h;//RTC工作在24小时制
   
	 stcCycSel.enCyc_sel = RtcPrads;//RTC定时周期选择为预分频
	 stcCycSel.enPrds_sel = Rtc_1Min;//RTC预分频选择为1分钟
#if 0 
    stcCycSel.enCyc_sel = RtcPradx;
    stcCycSel.u8Prdx = 1u;
#endif
    stcRtcConfig.pstcCycSel = &stcCycSel;
#if 1
    Rtc_DisableFunc(RtcCount);//关闭RTC计数功能
    stcAlarm.u8Minute = 0x01;
    stcAlarm.u8Hour = 0x00;
    stcAlarm.u8Week = 0x00;
    Rtc_DisableFunc(RtcAlarmEn);//关闭RTC闹钟使能功能
    Rtc_EnAlarmIrq(Rtc_AlarmInt_Enable);//使能中断
    Rtc_SetAlarmTime(&stcAlarm);//设置时间
    Rtc_EnableFunc(RtcAlarmEn);//使能闹钟
#endif
    stcTime.u8Year = 0x23;
    stcTime.u8Month = 0x08;
    stcTime.u8Day = 0x07;
    stcTime.u8Hour = 0x09;
    stcTime.u8Minute = 0x30;
    stcTime.u8Second = 0x00;
    stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);//计算时间对应得星期
    stcRtcConfig.pstcTimeDate = &stcTime;
    
    stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;//使能各种回调函数
    stcIrqCb.pfnTimerIrqCb = RtcCycCb;
    stcRtcConfig.pstcIrqCb = &stcIrqCb;
    stcRtcConfig.bTouchNvic = TRUE;
    
    Rtc_DisableFunc(RtcCount);
    Rtc_Init(&stcRtcConfig);     
    Rtc_EnableFunc(RtcCount);
//#if 1
//    while(1 == Gpio_GetIO(3,3));//注意:此处用户随便屏蔽,进入深度休眠模式。    
//    Lpm_Config(&stcLpmCfg);
//    Lpm_GotoLpmMode();
//#endif
}
cs 复制代码
static void RtcCycCb(void)//RTC周期中断回调函数
{
    cyccnt++;	
		Gpio_SetIO(0, 3, FALSE);//测试周期中断D2
    flg = ~flg;
    Gpio_SetIO(0,3,flg);
 
}
static void RtcAlarmCb(void)//RTC闹钟中断回调函数
{
	
}

低功耗

cs 复制代码
int32_t main(void)
{    
    //警告!!!为防止程序进入低功耗无法调试,请勿删除以下两行代码
    SK_SW2_INIT();
    NextStep();

    SK_LED_INIT();
    SK_LED_SET(1);

    //配置P33(SW2)为中断输入端口,下降沿触发
    Gpio_InitIOExt(0, 1, GpioDirIn, TRUE, FALSE, FALSE, FALSE);
    Gpio_EnableIrq(0, 1, GpioIrqFalling);
    
	//中断使能
    EnableNvic(PORT1_IRQn, DDL_IRQ_LEVEL_DEFAULT, TRUE);
// param [in]  u32Irq         中断号
// param [in]  u8Level        中断优先级
// param [in]  bEn            中断开关
// retval    Ok       设置成功
// 其他值   设置失败

    M0P_GPIO->CTRL0_f.IESEL = 1;

    Clk_SetFunc(ClkFuncWkupRCH, TRUE);
    SCB->SCR |= 0x4;       //sleepdeep
    __NOP();
    __NOP();
    __NOP();
    __NOP();
    __NOP();
//#define SK_LED_INIT()       Gpio_InitIO(0, 3, GpioDirOut)
//#define SK_LED_SET(x)       Gpio_SetIO(0,3,(x))

    while (1)
    {
        SK_LED_SET(0);
        delay1ms(2000);
        SK_LED_SET(1);
		
		printf("-------------\n");
        delay1ms(2000);
		
		
		
		
		
		
        __WFI();
    }
}
cs 复制代码
// Lpt中断服务函数

void LptInt(void)
{
    if (TRUE == Lpt_GetIntFlag())
    {
        Lpt_ClearIntFlag();
        u32LptTestFlag = 0x01;
    }
}

 // Lpt定时功能测试 (重载模式)

en_result_t LptTimerTest(void)
{
    stc_lpt_config_t stcConfig;
    en_result_t      enResult = Error;
    uint16_t         u16ArrData = 0;
 
    stc_lpm_config_t stcLpmCfg;
    
    Gpio_InitIO(2, 5, GpioDirIn);
    Gpio_InitIO(2, 6, GpioDirOut);
    Gpio_SetIO(2, 6, FALSE);
    
    stcConfig.enGateP  = LptPositive; 
    stcConfig.enGate   = LptGateDisable;
    stcConfig.enTckSel = LptIRC32K;
    stcConfig.enTog    = LptTogDisable;
    stcConfig.enCT     = LptTimer;
    stcConfig.enMD     = LptMode2;
    
    stcConfig.pfnLpTimCb = LptInt;
    
    if (Ok != Lpt_Init(&stcConfig))
    {
        enResult = Error;
    }
    
    //Lpm Cfg
    stcLpmCfg.enSEVONPEND   = SevPndDisable;
    stcLpmCfg.enSLEEPDEEP   = SlpDpEnable;
    stcLpmCfg.enSLEEPONEXIT = SlpExtDisable;
    Lpm_Config(&stcLpmCfg);
    
    //Lpt 中断使能
    Lpt_ClearIntFlag();
    Lpt_EnableIrq();
    EnableNvic(LPTIM_IRQn, 3, TRUE);
    
    
    //设置重载值,计数初值,启动计数
    Lpt_ARRSet(u16ArrData);
    Lpt_Run();
    
    
    //判断P25,如果为高电平则,进入低功耗模式......
    //注:若芯片处于低功耗模式,则芯片无法使用SWD进行调式和下载功能。
    //故如需要继续下载调试其他程序,需要将P25接低电平。
#if 0
    if (TRUE == Gpio_GetIO(2, 5))
    {
        Gpio_SetIO(2, 6, TRUE);
        Lpm_GotoLpmMode();
    }
#endif    
    //低功耗模式下,继续计数,直到溢出产生中断,退出低功耗模式。
    while(1)
    {
        if (0x01 == u32LptTestFlag)
        {
            u32LptTestFlag = 0;
            Lpt_Stop();
            Gpio_SetIO(2, 6, FALSE);
            enResult = Ok;
            break;
        }
    }
    
    return enResult;
}
相关推荐
scan17 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
Qingniu017 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
Mortal_hhh9 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
深圳市青牛科技实业有限公司9 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比10 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie10 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
鹿屿二向箔10 小时前
STM32外设之SPI的介绍
stm32
西瓜籽@10 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^1382879887213 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张14 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩