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;
}