【TC3xx芯片】TC3xx芯片的Endinit功能详解

目录

前言

正文

1.功能概述

2. WDTxCON0 的密码访问(Password Access to WDTxCON0)

2.1 Static Password

2.2 Automatic Password Sequencing

2.3 Time-Independent Pasword

2.4 Time Check Password

3. WDTxCON0的检查访问(Check Access to WDTxCON0)

4. WDTxCON0的修改访问(Modify Access to WDTxCON0)

5. 访问受Endinit保护的寄存器 

5.1 通过WDT访问Endinit保护的寄存器

5.2 不通过WDT访问Endinit保护的寄存器

6. Endinit实际应用

6.1 Endinit需求及场景介绍

6.2 Endinit解锁

6.3 Endinit上锁

7. 总结


前言

为了提供系统的安全性能,TC3xx上一些重要的寄存器都受Endinit保护不能直接修改。如果想要修改这些重要寄存器,就需要先按特定步骤解锁Endinit,然后才能修改这些重要的寄存器的值,最后还要上锁Endinit。那什么是Endinit功能了? -- 本文就来详细解锁TC3xx芯片的Endinit机制

Note: 第1到5章节都是关于Endinit的概念介绍,如果感觉比较枯燥可以先从第6章节的实际应用开始阅读。

缩略词

简写

全称

Endinit

End of initialization

WDTCPUyCON0

CPUy WDT Control Register 0

WDTSSR

Safety WDT Status Register

正文

1.功能概述

在系统或应用程序的初始化过程中,通常只对一些寄存器进行一次编程(programmed only once)。 在正常应用程序运行期间修改此类寄存器可能会严重影响模块或整个系统的整体运行。

虽然 Supervisor Mode 和 Access Protection 方案提供了一定级别的保护,防止意外修改,但它们可能不足以防止对系统关键注册器的所有意外访问。

为这类寄存器提供了额外的保护,称为 Endinit (“End off initialization”)。 Endinit 是一种写保护方案,它只允许在特定时间进行写入,并使受此功能保护的寄存器的意外修改几乎不可能实现。

Endinit 功能由每个 WDT 控制寄存器中包含的 ENDINIT 位组成。 通过 Endinit 保护的寄存器决定是否启用写入。 只有当相应的 ENDINIT =0 且主管模式处于活动状态时,才会启用写入。 如果这种情况不正确,则写入尝试将被放弃,在这种情况下,寄存器内容将不会被修改。

为了获得最高的稳定性,写入 ENDINIT 位将受到 WDT 中实施的高度安全的访问保护方案的保护。 这是一个复杂的过程,几乎不可能无意中修改 ENDINIT  bits。 此外,每次软件通过清除相应的 ENDINIT 位来打开对关键寄存器的访问时,每个 WDT 都会启动超时序列来监视 ENDINIT 位的修改。 如果超时时间在相应的 ENDINIT 位再次设置之前结束,则假定软件出现故障,并生成看门狗故障响应。

以下各节介绍了 WDT 的访问保护方案和 Endinit 超时操作。 在每个模块 (包括 SCU 本身) 的寄存器概览表中,通过每个 Endinit 类型保护的寄存器在描述写入访问的列中标识,如下所示:

. “ CEy ” - CPU 关键寄存器。 仅当 CPUy WDT ENDINIT=0 (y=CPU number) 时可写。也就是,只有把要要访问这个寄存器的CPU的ENDINIT设为0后,这个寄存器才能被这个CPU写访问(也就是解锁WDTCPUyCON0.ENDINIT)。

. “ E ” - 系统关键寄存器 - 任何 (一个或多个) CPUy 看门狗计时器 ENDINIT=0 或 EICON0.ENDINIT=0 时可写。也就是,任意一个CPU的ENDINIT设为0后,所有CPU都可以对这个寄存器进行写访问。

. “ SE ” - 安全关键寄存器 - 仅当安全监控计时器 ENDINIT=0 或 SEICON0.ENDINIT=0 时才可写入。也就是,Safety Watchdog的ENDINIT设为0后,Safety EndInit的保护就解除了,所有CPU都可以对这个寄存器进行写访问(也就是解锁WDTSCON0.ENDINIT)。

. 以上都不是 - 随时都可以访问

图 1 显示了解锁各种 ENDINIT 写保护模式的选项。

Figure 1: ENDINIT Control Registers

Note: ENDINIT 位的清除需要一些时间。 在清除 ENDINIT 位后访问受 Endinit 保护的寄存器必须仅在 ENDINIT 位真正被清除时进行。 作为一种解决方案, ENDINIT 位应在 ENDINIT位 清除后第一次访问受 Endinit 保护的寄存器之前被读回一次。

2. WDTxCON0 的密码访问(Password Access to WDTxCON0)

USART_InitTypeDef USART_InitStructure;//初始化IO 串口3//pclk1:PCLK1时钟频率(Mhz)//bound:波特率 void usart3_init(u32 bound){ NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能 USART_DeInit(USART3); //复位串口3 //USART3_TX PB10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10 //USART3_RX PB11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11 USART_InitStructure.USART_BaudRate = bound; //波特率一般设置为9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART3, &USART_InitStructure); //初始化串口3 USART_Cmd(USART3, ENABLE); //使能串口 //使能接收中断 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断 //设置中断优先级 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 TIM7_Int_Init(99,7199); //10ms中断 USART3_RX_STA=0; //清零 TIM_Cmd(TIM7,DISABLE); //关闭定时器7}//串口3,printf 函数 发送端LORA模块发送数据//确保一次发送数据不超过USART3_MAX_SEND_LEN字节void u3_printf(char* fmt,...) { u16 i,j; va_list ap; va_start(ap,fmt); vsprintf((char*)USART3_TX_BUF,fmt,ap); //使用参数列表发送格式化输出到字符串 va_end(ap); i=strlen((const char*)USART3_TX_BUF); //此次发送数据的长度 for(j=0;j<i;j++) //循环发送数据 { while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕 USART_SendData(USART3,USART3_TX_BUF[j]); } } //串口接收使能控制//enable:0,关闭 1,打开void usart3_rx(u8 enable){ USART_Cmd(USART3, DISABLE); //失能串口 if(enable) { USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式 }else { USART_InitStructure.USART_Mode = USART_Mode_Tx;//只发送 } USART_Init(USART3, &USART_InitStructure); //初始化串口3 USART_Cmd(USART3, ENABLE); //使能串口 }
最新发布
04-04
### STM32 USART3 初始化与配置详解 STM32 的 USART3 是一种通用同步/异步收发器,用于实现串行通信功能。以下是关于 STM32 中 USART3 初始化和配置的详细说明以及代码解释。 #### 配置步骤概述 USART3 的初始化通常涉及以下几个方面: 1. **时钟使能**:启用相关外设的时钟。 2. **GPIO 配置**:设置 TX 和 RX 引脚的功能模式。 3. **USART 初始化结构体配置**:定义波特率、数据位数、停止位、校验方式等参数。 4. **中断或 DMA (可选)**:如果需要使用中断或 DMA 进行数据传输,则需进一步配置。 5. **使能 USART 外设**:启动 USART 功能。 以下是一个典型的 STM32 USART3 初始化代码示例及其逐行解析: ```c #include "stm32f1xx_hal.h" void MX_USART3_UART_Init(void) { UART_HandleTypeDef huart3; // GPIO 时钟使能 __HAL_RCC_GPIOB_CLK_ENABLE(); // USART3 时钟使能 __HAL_RCC_USART3_CLK_ENABLE(); // 配置 GPIO 引脚为复用模式(TX: PB10, RX: PB11) GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 设置为复用推挽输出模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不上拉不下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;// 高速模式 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 配置 USART 参数 huart3.Instance = USART3; // 使用 USART3 实例 huart3.Init.BaudRate = 9600; // 波特率为 9600bps [^1] huart3.Init.WordLength = UART_WORDLENGTH_8B; // 数据长度为 8 位 huart3.Init.StopBits = UART_STOPBITS_1; // 停止位为 1 huart3.Init.Parity = UART_PARITY_NONE; // 无奇偶校验 huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 关闭硬件流控制 huart3.Init.Mode = UART_MODE_TX_RX; // 启用发送和接收模式 if (HAL_UART_Init(&huart3) != HAL_OK) { Error_Handler(); // 如果初始化失败则调用错误处理函数 } } ``` #### 代码分析 - `__HAL_RCC_GPIOB_CLK_ENABLE()` 和 `__HAL_RCC_USART3_CLK_ENABLE()`: 分别启用了 GPIOB 和 USART3 所需的时钟资源。 - `GPIO_InitStruct` 结构体中的 `.Pin`, `.Mode`, `.Pull`, 和 `.Speed` 字段分别指定了引脚编号、工作模式、上下拉状态及速度等级。 - `UART_HandleTypeDef` 类型变量 `huart3` 负责存储 USART3 的具体配置信息。其中的关键字段包括但不限于波特率 (`BaudRate`)、字长 (`WordLength`)、停止位 (`StopBits`) 及校验方式 (`Parity`) 等。 - `HAL_UART_Init()` 函数完成实际的硬件初始化操作,并返回执行结果的状态码。 #### 注意事项 - 在调试过程中应确保所使用的波特率匹配双方设备的要求。 - 若采用中断驱动的方式,则还需额外编写 ISR (Interrupt Service Routine),并注册相应的回调函数。 - 当涉及到多路复用信号线时,请仔细核对连接关系以免发生冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车电子嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值