历史上的今天
今天是:2025年03月09日(星期日)
2019年03月09日 | stm32 看门狗 BKP(HAL库)
2019-03-09 来源: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);
}
}
}
下一篇:STM32的四种IO输出模式
史海拾趣
|
LED是T型和N型半导体,三价有电洞,五价提供电子,两者结合中间有空乏区,能够产生能量,光就发出来。由于它是半导体,有能隙,随著参杂元素的不同而产生不同能隙,从氮化镓的3.4eV到磷化铟的1.35eV,波长亦随著改变,而产生出不同的颜色,从紫外光 ...… 查看全部问答> |
|
一直想通过wince上的程序连接pc上的数据库如sql server,mysql等,一直没搞定。不知有没有大侠能够指导一下啊? 这几天看了下sqlite数据库的东西,简单小程序能写了,但是发现sqlite有个问题就是好像不支持c/s结构,只能在本地进行sq ...… 查看全部问答> |
|
终于收到力源申请的套件了,哈哈哈哈还以为与她无缘,现在开始,晚上的"夜生活"开始丰富了也开始倒塌STM32~~~~~~~~~~~~~~~~~~~… 查看全部问答> |
|
(写得很认真,先留着,等板子来了就可以耍了!感谢作者) 故事的起因是这样滴。。。LaunchPad包装盒中并没有附带资料光盘(至少我收到的是这样的),只有一张纸的简单介绍,即TI网站上的文档MSP-EXP430G2 LaunchPa ...… 查看全部问答> |
|
转自:deyisupport 前面有两篇关于仪表放大器 (INA) 电源及共模抑制比 (PSRR & CMRR) 的极好博客文章。(参见“处理抑制问题:仪表放大器 PSRR 与 CMRR”第 I 部分 和 第 II 部分)。 准确指出了大多数 INA 器件的 CMRR 与 PSRR 性能会随增益变化 ...… 查看全部问答> |
|
转自deyisupport 你看没看到过汽车向前行驶,而车的轮子实际上是向后转呢?如果不是在表演高难度特技的话,我打赌你一定在汽车广告中看到过。你想没想过这是为什么呢?真实的生活如流水般不可中断,而视频摄像头每秒钟只记录了有限数量的画面。每 ...… 查看全部问答> |




