STM32F103 几个特殊引脚做普通io使用注意事项以及备份寄存器丢失数据问题1,2

stm32F103C8T6芯片 

备份寄存器数据丢失两种可能:

1、触发了入侵中断

PC13 做为普通IO使用时 要禁用入侵中断功能,否则会导致备份寄存器数据在关机,在启动的时候数据丢失,(可以查阅其他文章,不详解)

2、  芯片VBAT 在关机的时候掉电. 如果需要备份寄存器在关机的时候保存数据,那么VBAT需要接到纽扣电池,如果关机之后VBAT也掉电,备份寄存器是无法保存的,当时我就是好奇为什么备份寄存器数据总是丢失,之后发现是VBAT的原因,后来改成了 flash存储的数据,做法:关机的时候触发 低电压中断,然后保存数据到flash.(一般用MCU内部的flash 存储的话,100uF 足够512字节存储)

 

下面是几个特殊引脚的说明:

1、PC13   RTC

入侵功能介绍:

 侵入检测功能分析:功能数据备份。

1 BKP_CR的TPAL位,设定决定TAMPER引脚的信号由0变1或是又1变0为有效触发信号,产生侵入检测事件置位标志 位(BKR_CSR 的TEF)。

2 侵入检测事件后会将所有数据备份寄存器复位。

3 注意一点的是:在BKP_CR的TPE位允许使能之前,一当有侵入检测引脚产生的侵入检测事件也是有效的。这一点有利 于更好的保护数据。

4.一当TPAL=0(或1),如果在在BKP_CR的TPE位允许(侵入检测引脚允许位)使能之前TPAL=1(或0),则一旦允许了侵入检测功能,则会产生一个额外的侵入事件。尽管BKP_CR的TPE(侵入检测引脚允许位)位为1后并为出现新的沿跳变

5 在一个侵入检测事件被检测到并被清零后,侵入检测引脚应该要禁止掉。当再次在想写数据备份寄存器之前重新设置BKP_CR的TPE位(侵入检测引脚允许位)。这样可以避免侵入检测引脚上仍有侵入检测事件产生时,不断的对数据备份寄存器写操作。

6VDD电源断开时, 侵入检测功能仍有效,位了避免不必要的数据备份寄存器复位,TAMPER引脚外部应连接到正确的电平上。

 

初始化IO的时候加上这句号:     

      PWR_BackupAccessCmd( ENABLE );/* 允许修改RTC和后备寄存器*/
     RCC_LSEConfig(RCC_LSE_OFF);//关闭外部低速外部时钟信号功能 后,PC13 PC14 PC15 才可以当普通IO用。
     BKP_TamperPinCmd(DISABLE);  /* 关闭入侵检测功能,PC13可以用作普通IO*/
     BKP_ITConfig(DISABLE);       /* 禁止TAMPER 中断*/

 

2、 PA13  PA14  PA15   这三个脚默认是  JTAG脚 ,就算是按照普通IO进行初始化也是不可以正常用的需要添加

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);

则可以当做正常IO使用

 

 

 

 

 

STM32F103RC上使用TIM1驱动IO反转,可以通过以下步骤实现: 1. 配置TIM1的定时器功能和IO反转功能。具体可以参考STM32F103RC的Reference Manual。 2. 对于需要反转的IO引脚,需要配置为TIM1的通道输出模式,具体可以参考STM32F103RC的Datasheet。 3. 在程序中,通过TIM1的CCR寄存器来控制IO的反转。当CCR的值小于TIM1的ARR寄存器的值时,IO引脚将被拉低。当CCR的值大于TIM1的ARR寄存器的值时,IO引脚将被拉高。当CCR的值等于TIM1的ARR寄存器的值时,IO引脚将被反转。 下面是一个简单的代码示例,实现了每隔1s反转PB0引脚的输出状态: ``` #include "stm32f10x.h" void TIM1_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseInitStructure.TIM_Period = 999; // 设置计数器的自动重载值 TIM_TimeBaseInitStructure.TIM_Prescaler = 7199; // 设置预分频器 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数器向上计数 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 输出比较模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能 TIM_OCInitStructure.TIM_Pulse = 499; // 设置CCR的值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; // 设置输出极性为低电平 TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM1, ENABLE); // 使能TIM1的输出 TIM_Cmd(TIM1, ENABLE); // 使能TIM1 } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB的时钟 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 设置PB0引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); TIM1_Init(); // 初始化TIM1 while(1) { TIM_SetCompare1(TIM1, 499); // 设置CCR的值,使PB0引脚拉低 delay_ms(1000); TIM_SetCompare1(TIM1, 0); // 设置CCR的值,使PB0引脚拉高 delay_ms(1000); } } ``` 注意,上述代码只是一个简单的示例,需要根据实际需求进行修改。同时,为了实现延时函数delay_ms(),需要自行实现或使用别人已经实现的函数库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值