历史上的今天
今天是:2024年11月16日(星期六)
2019年11月16日 | stm32 看门狗 BKP(HAL库)
2019-11-16 来源:eefocus
(一)概述
stm32有两个看门狗:硬件看门狗(LSI 40KHz,时间精度不高)和窗口看门狗(APB1)。
(二)硬件看门狗实现代码
IWDG_HandleTypeDef hiwdg;
// 硬件看门狗初始化
static void MX_IWDG_Init(IWDG_HandleTypeDef *pHiwdg)
{
pHiwdg->Instance = IWDG;
pHiwdg->Init.Prescaler = IWDG_PRESCALER_4;
pHiwdg->Init.Reload = 0xFFF; // Tout = ((4 * 2^prer) * rlr) / 40 = 409ms,看门狗溢出时间
if (HAL_IWDG_Init(pHiwdg) != HAL_OK)
{
Error_Handler();
}
}
int main(void)
{
........
MX_IWDG_Init(&hiwdg);
........
HAL_IWDG_Start(&hiwdg);
while (1)
{
........
HAL_IWDG_Refresh(&hiwdg);
}
}
(三)初始上电获取硬件看门狗复位状态
if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET)
{
}/* 硬件看门狗复位 */
__HAL_RCC_CLEAR_RESET_FLAGS();
(四)看门狗复位后IO状态的保持方法
法一:硬件方式,锁存器。
法二:软件方式,当需要关注的IO状态改变时,立马存在Flash中,初始上电判断复位类型是硬件看门狗,就进行Flash读取和IO操作。该方式的缺点:由于stm32的Flash写操作是页写,每次写之前,都要先擦除,而且Flash的写次数有限,故经常写,Flash经常写的区域有可能被写坏。
法三:软件方式,BKP+初始判断处理(stm32F103RC大容量,备份寄存器是42个16位的寄存器)。
// BKP
#define BKP_DATA_LEN 16
#define BKP_MAX_DATA_LEN 42
#define BKP_INTERVAL_POINT 10
// 写备份寄存器
void BKP_Write(uint8_t *pSourcedata, uint32_t num)
{
assert_param(num <= BKP_MAX_DATA_LEN);
volatile uint32_t *pDestData;
RCC->APB1ENR |= (1 << 27 | 1 << 28); // 电源接口时钟/备份时钟开启
PWR->CR |= 1 << 8; // 允许写入后备寄存器
if (num > BKP_INTERVAL_POINT)
{
pDestData = &(BKP->DR1);
for (uint32_t i = 0; i < BKP_INTERVAL_POINT; i++)
{
*(pDestData + i) = *(pSourcedata + i);
}
pDestData = &(BKP->DR11);
for (uint32_t i = 0; i < (num - BKP_INTERVAL_POINT); i++)
{
*(pDestData + i) = *(pSourcedata + i + BKP_INTERVAL_POINT);
}
}
else
{
pDestData = &(BKP->DR1);
for (uint32_t i = 0; i < num; i++)
{
*(pDestData + i) = *(pSourcedata + i);
}
}
}
// 读备份寄存器
void BKP_Read(uint8_t *pReadData, uint32_t num)
{
assert_param(num <= BKP_MAX_DATA_LEN);
volatile uint32_t *pSourceData;
if (num > BKP_INTERVAL_POINT)
{
pSourceData = &(BKP->DR1);
for (uint32_t i = 0; i < BKP_INTERVAL_POINT; i++)
{
*(pReadData + i) = *(pSourceData + i);
}
pSourceData = &(BKP->DR11);
for (uint32_t i = 0; i < (num - BKP_INTERVAL_POINT); i++)
{
*(pReadData + i + BKP_INTERVAL_POINT) = *(pSourceData + i);
}
}
else
{
pSourceData = &(BKP->DR1);
for (uint32_t i = 0; i < num; i++)
{
*(pReadData + i) = *(pSourceData + i);
}
}
}
下一篇:stm32F1RTC
史海拾趣
|
ARM程序中,如果不用延时,就没法运行,但又不是硬件延时的奇怪问题。[ 问题出在在现有的LCD汉字显示驱动的基础上继续开发时。 有个一个搜索函数,代码如下,功能是在一个给定的地址开始,连续搜索一个汉字编码(2byte),找到编码就返回位置,函数很简单。 现在的问题 ...… 查看全部问答> |
|
1:有啥网站网络资源推荐? 2:我不明白为什么新的设备插到电脑上,电脑能够调用相应的驱动程序的。 3:我想知道从外不设备上电后,直到能正常工作的时候,发生的一系列过程,请帮忙 粗略概要。… 查看全部问答> |
|
中心议题: 雷击浪涌分析防雷击浪涌电路的设计 解决方案: 应用将压敏电阻和陶瓷气体放电管的单相并联使用线绕电阻断开电路 随着城市经济的发展,感应雷和雷电波侵入造成的危害却大大增加。一般建筑物上的避雷针只能预防直击雷,而强大的电磁场 ...… 查看全部问答> |
|
我最近要做stm32的微功耗~在看过一些资料后,人们介绍说:stm32的待机模式,功耗是最低的,这样我就看是了解待机模式,我在手册中发现,待机模式下的单片机是不工作的,也不能保持待机前的状态,所以待机后,所有的管教都处于高阻态(不知道这 ...… 查看全部问答> |
|
STM32F103RBT6的调试口PA14PA15能否用作普通的IO口 是否如下关闭SWJ后,就可按普通IO口配置PA14,PA15就可以了? // SWJ 禁止 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);… 查看全部问答> |




