APM32F103 RTC内部时钟源报警中断例程测试
APM32F103 RTC内部时钟源报警中断例程测试
- ✨相关篇推荐《【开源电路】STM32F103VCT6开发板》
- 📌关篇《APM32F103 RTC内部时钟源秒中断例程测试》
- 📌本案例来源于官方的SDK固件包:
https://www.geehy.com/support/apm32
🎈源码位置:
D:\APM\APM32F10x_SDK_V1.8\Examples\RTC\RTC_Alarm
- 🔰APM32F103芯片只是拿来做测试,作为量产使用,请慎重考虑!
📢案例说明
该案例默认是配置的PE5(LED2)、PE6(LED3)引脚状态间隔0.5s翻转,报警中断是通过PA1接上拉按键,使用外部下降沿触发中断,来激活配置下一次的RTC报警中断发生的时间,设置的时间为当前触发按键中断时间加5s。
- ⛳该代码同样可以烧录到同类型的
STM32F103VC
芯片上也可以运行,采用上面自制的开发板在不做任何修改直接烧录,可以看到相同效果。自制的开发板上的3个led分别是:PE5、PE6、PB5,该工程代码默认定义的2个LED分别是PE5、PE6. - 外部中断引脚:PA1,中断线为:
EINT_LINE_1
void APM_MINI_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode)
{
GPIO_Config_T GPIO_configStruct;
EINT_Config_T EINT_configStruct;
/* Enable the BUTTON Clock */
RCM_EnableAPB2PeriphClock(BUTTON_CLK[Button] | RCM_APB2_PERIPH_AFIO);
/* Configure Button pin as input floating */
GPIO_configStruct.mode = GPIO_MODE_IN_PU;
GPIO_configStruct.pin = BUTTON_PIN[Button];
GPIO_Config(BUTTON_PORT[Button], &GPIO_configStruct);
if (Button_Mode == BUTTON_MODE_EINT)
{
/* Connect Button EINT Line to Button GPIO Pin */
GPIO_ConfigEINTLine(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]);
/* Configure Button EINT line */
EINT_configStruct.line = BUTTON_EINT_LINE[Button];
EINT_configStruct.mode = EINT_MODE_INTERRUPT;
EINT_configStruct.trigger = EINT_TRIGGER_FALLING;
EINT_configStruct.lineCmd = ENABLE;
EINT_Config(&EINT_configStruct);
/* Enable and set Button EINT Interrupt to the lowest priority */
NVIC_EnableIRQRequest(BUTTON_IRQn[Button], 0x0f, 0x0f);
}
}
- 🎉如果想修改为其他引脚,请参考用户手册《
APM32F103xCxDxE用户手册 V1.5.pdf
》第:92
页内容:
- 📋按键中断服务函数
void EINT1_Isr(void)
{
if (EINT_ReadIntFlag(EINT_LINE_1) == SET)
{
EINT_ClearIntFlag(EINT_LINE_1);
uint16_t time;
time = RTC_ReadCounter();
/* set alarm for 5 s */
RTC_ConfigAlarm(time + 5);
RTC_WaitForLastTask();
printf("Time : %ds\r\n", time);
printf("5s later trigger the alarm\r\n");
}
}
- ✨如果修改为自动5秒触发下一次的RTC报警中断方法:只需要在RTC报警中断服务函数中添加设置下一次触发的时间即可,这样就不需要配置按键来触发RTC报警中断进行测试了。具体实现如下:
void RTC_Isr(void)
{
uint16_t time;
time = RTC_ReadCounter();
RTC_ConfigAlarm(time + 5);//自动开启5s后报警
printf("Time : %ds\r\n", time);
printf("ALARM INTERRUPT!\r\n");
RTC_ClearIntFlag(RTC_INT_ALR);
}
- main主函数代码:
int main(void)
{
USART_Config_T usartConfigStruct;
/* Configures LED2 and LED3 */
APM_MINI_LEDInit(LED2);
APM_MINI_LEDInit(LED3);
/* USART configuration */
USART_ConfigStructInit(&usartConfigStruct);//串口配置
// usartConfigStruct.baudRate = 115200;
// usartConfigStruct.mode = USART_MODE_TX_RX;
// usartConfigStruct.parity = USART_PARITY_NONE;
// usartConfigStruct.stopBits = USART_STOP_BIT_1;
// usartConfigStruct.wordLength = USART_WORD_LEN_8B;
// usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
/* COM1 init*/
APM_MINI_COMInit(COM1, &usartConfigStruct);//使能串口时钟,串口1:PA9/tx,PA10/rx
/* KEY1 init*/
APM_MINI_PBInit(BUTTON_KEY1, BUTTON_MODE_EINT);//默认是PA1,已修改为PB1
RTC_Init();
if (SysTick_Config(SystemCoreClock / 1000))
{
while (1);
}
printf("This example is for RTC Alarm\r\n");
printf("Alarm will be triggered in 5 s\r\n");
// printf("Later press KEY1 can set alarm for 5 s\r\n");
while (1)
{
APM_MINI_LEDToggle(LED2);
APM_MINI_LEDToggle(LED3);
Delay(500);
}
}
- 📜串口打印信息
📝配置为RTC外部时钟报警中断
- ⚡请注意:下面的方法仅支持
STM32F103VC
,不支持
APM32F03VC。
void RTC_Init(void)
{
RCM_EnableAPB1PeriphClock((RCM_APB1_PERIPH_T)RCM_APB1_PERIPH_PMU);
PMU_EnableBackupAccess();
/* LSI Enable */
// RCM_EnableLSI();
// while (RCM_ReadStatusFlag(RCM_FLAG_LSIRDY) == RESET){}
// RCM_ConfigRTCCLK(RCM_RTCCLK_LSI);
/* LSE Enable */
RCM_ConfigLSE(RCM_LSE_OPEN);
while (RCM_ReadStatusFlag(RCM_FLAG_LSERDY) == RESET){}
RCM_ConfigRTCCLK(RCM_RTCCLK_LSE);
RCM_EnableRTCCLK();
RTC_WaitForSynchro();
RTC_WaitForLastTask();
/* ALARM INTERRUPT Enable */
RTC_EnableInterrupt(RTC_INT_ALR);
RTC_WaitForLastTask();
RTC_ConfigPrescaler(32767);
RTC_WaitForLastTask();
/* 5 s ALARM */
RTC_ConfigAlarm(5);
RTC_WaitForLastTask();
/* COUNT SET 0 */
RTC_ConfigCounter(0);
RTC_WaitForLastTask();
NVIC_EnableIRQRequest(RTC_IRQn, 0, 0);
}