给项目添加一个小功能——GPIO写保护功能,我们的项目MCU通过一个引脚控制着电源芯片的使能引脚,在上电启动后,将此引脚拉低即可使能整个系统运行。添加GPIO写保护功能后,此引脚不会再被意外修改,最大限度上规避程序问题导致系统宕机的可能性。
查看datasheet时,GPIO写保护锁定功能内容较少,仅GPIOx_WPR.bit16一个标志位来标识,特别简单。但又比较复杂,因为配置GPIO写保护成功需要一个配置序列来实现,而非一个简简单单的置位。具体配置序列如下:
写保护使能位操作按照以下方式操作 4 次,写’1’ -> 写’0’ -> 写’1’ ->读,操作期间 WPEN 位值不可修改。
看着有点复杂,而且也不知道具体要如何操作?还好!雅特力官方的代码库实现了GPIO写保护锁定功能的API,直接调用即可:
/**
* [url=/u/brief]@brief[/url] write protect gpio pins configuration registers.
* @param gpio_x: to select the gpio peripheral.
* this parameter can be one of the following values:
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH.
* @param pins: gpio pin number
* this parameter can be any combination of the following:
* - GPIO_PINS_0
* - GPIO_PINS_1
* - GPIO_PINS_2
* - GPIO_PINS_3
* - GPIO_PINS_4
* - GPIO_PINS_5
* - GPIO_PINS_6
* - GPIO_PINS_7
* - GPIO_PINS_8
* - GPIO_PINS_9
* - GPIO_PINS_10
* - GPIO_PINS_11
* - GPIO_PINS_12
* - GPIO_PINS_13
* - GPIO_PINS_14
* - GPIO_PINS_15
* - GPIO_PINS_ALL
* @retval none
*/
void gpio_pin_wp_config(gpio_type *gpio_x, uint16_t pins)
{
uint32_t temp = 0x00010000;
temp |= pins;
/* set wpen bit */
gpio_x->wpr = temp;
/* reset wpen bit */
gpio_x->wpr = pins;
/* set wpen bit */
gpio_x->wpr = temp;
/* read wpen bit*/
temp = gpio_x->wpr;
/* read wpen bit*/
temp = gpio_x->wpr;
}
看了这段示例代码,我发现文档的表述还是简单了。感觉文档的表述忽略了一个技术点——只有在序列中的GPIOx_WPR.bit16 = 0时,写入要保护的GPIO引脚才起效。
我看文档里面还标注上述序列要顺序执行4次,以保证GPIO写保护功能被成功写入。
我倒是觉得在执行一次写保护序列后,回读一下结果。如果结果已经写保护,应该就不需要再重复执行了。