目录
一、裸机实现温度检测
参考:
【沁恒RISC-V内核 CH582】AHT10 - 国产芯片交流 - 电子工程世界-论坛
头文件改成57系列即可:
CH573 CH582 CH579外设UART例程讲解(更改打印串口) - WCH蓝牙应用分享 - 博客园 (cnblogs.com)
二、RCT---定时唤醒
采用3个纽扣电池供电,开启内部DC-DC,开始睡眠模式,8秒RTC唤醒LLED闪烁一次指示在工作AHT10检测20次,不超过报警温度再次睡眠,超设定温度值LED闪烁,待温度恢复。
#include "CH57x_common.h"
#include "AHT10.h"
#define TEST_DEBUG (0)
#define CHECK_NUM (20)
#define ALARM_TEMP (40)
/*********************************************************************
* @fn DebugInit
*
* @brief 调试初始化
*
* @return none
*/
void DebugInit(void)
{
GPIOPinRemap(ENABLE, RB_PIN_UART0);
GPIOA_SetBits(GPIO_Pin_14);
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU);
GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
UART0_DefInit();
}
/*********************************************************************
* @fn RTCInit
*
* @brief RTC设置
*
* @return none
*/
void RTCInit(void)
{
RTC_InitTime(0, 0, 0, 0, 0, 0);
RTC_TMRFunCfg(Period_8_S);
PFIC_EnableIRQ(RTC_IRQn);
PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_RTC_WAKE, Edge_LongDelay);
LowPower_Sleep(RB_PWR_RAM16K | RB_PWR_RAM2K); //只保留14+2K SRAM 供电
HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
}
/*********************************************************************
* @fn GPIOInit
*
* @brief GPIO设置
*
* @return none
*/
void GPIOInit(void)
{
GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_5mA); //LED
GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_5mA); //POWER
GPIOB_SetBits(GPIO_Pin_12);
GPIOA_ResetBits(GPIO_Pin_12);
DelayMs(100);
GPIOA_SetBits(GPIO_Pin_12);
}
/*********************************************************************
* @fn main
*
* @brief 主函数
*
* @return none
*/
__attribute__((section(".highcode")))
int main()
{
float temperate;
uint8_t humidity;
uint8_t var;
SetSysClock(CLK_SOURCE_PLL_48MHz);
PWR_DCDCCfg(ENABLE);
/* 配置串口调试 */
LClk32K_Select(Clk32K_LSI);//启用内部32K
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
R8_CK32K_CONFIG |= RB_CLK_INT32K_PON;
R8_SAFE_ACCESS_SIG = 0;
//LED
GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_5mA);
GPIOA_ResetBits(GPIO_Pin_12);
DelayMs(100);
GPIOA_SetBits(GPIO_Pin_12);
DelayMs(100);
GPIOA_ResetBits(GPIO_Pin_12);
DelayMs(100);
GPIOA_SetBits(GPIO_Pin_12);
while(1){
GPIOInit();
AHT10Init();
#if ( TEST_DEBUG == 1 )
DebugInit();
PRINT("wake\n");
#endif
for (var = 0; var < CHECK_NUM; ++var)
{
AHT10ReadData(&temperate,&humidity);
while(temperate > ALARM_TEMP){
AHT10ReadData(&temperate,&humidity);
DelayMs(100);
GPIOA_InverseBits(GPIO_Pin_12);
#if ( TEST_DEBUG == 1 )
PRINT("temperate:%.1f\n",temperate);
#endif
}
#if ( TEST_DEBUG == 1 )
PRINT("temperate:%.1f\n",temperate);
#endif
}
GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
RTCInit();
}
}
/*********************************************************************
* @fn RTC_IRQHandler
*
* @brief RTC中断函数
*
* @return none
*/
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void RTC_IRQHandler(void)
{
if(RTC_GetITFlag(RTC_TMR_EVENT)){
RTC_ClearITFlag(RTC_TMR_EVENT);
#if ( TEST_DEBUG == 1 )
UINT16 py; UINT16 pmon; UINT16 pd; UINT16 ph; UINT16 pm; UINT16 ps;
RTC_GetTime(&py,&pmon,&pd,&ph,&pm,&ps);
printf("%dS\r\n",ps);
#endif
}
}
8秒唤醒检测
超温闪烁
参考文章:
CH579 CH573 CH582 RTC唤醒唤醒操作 - debugdabiaoge - 博客园 (cnblogs.com)