华大芯片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;
}
相关推荐
嗯嗯=21 分钟前
STM32单片机学习篇9
stm32·单片机·学习
小范馆5 小时前
ESP各模组的引脚图-小智接线图
stm32
松涛和鸣5 小时前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
想放学的刺客8 小时前
单片机嵌入式试题(第23期)嵌入式系统电源管理策略设计、嵌入式系统通信协议栈实现要点两个全新主题。
c语言·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆8 小时前
【Linux 驱动开发】五. 设备树
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·硬件工程
YouEmbedded9 小时前
解码内部集成电路(IIC)与OLED屏
stm32·0.96寸oled·硬件iic·软件模拟iic·图片取模·汉字取模
jghhh0110 小时前
基于上海钜泉科技HT7017单相计量芯片的参考例程实现
科技·单片机·嵌入式硬件
恶魔泡泡糖10 小时前
51单片机外部中断
c语言·单片机·嵌入式硬件·51单片机
意法半导体STM3210 小时前
【官方原创】如何基于DevelopPackage开启安全启动(MP15x) LAT6036
javascript·stm32·单片机·嵌入式硬件·mcu·安全·stm32开发
v_for_van10 小时前
STM32低频函数信号发生器(四通道纯软件生成)
驱动开发·vscode·stm32·单片机·嵌入式硬件·mcu·硬件工程