本文介绍一种当外设连接在下载复位引脚时在不影响下载功能的前提下正常使用外设的一种方法。
在使用STM32的时候可能会遇到这样一种情况:比如你是用的是STM32RBT6这款芯片,你想使用板载的某个外设,当你查看电原理图后发现这个外设连接在PB4,然后你又去查看芯片数据手册发现:
PB4在上电后默认是JNTRST,这是啥意思呢?意思就是PB4上电后并不是普通IO,而是下载复位引脚,PB4的分时复用功能才是普通IO。如果我们要使用PB4为普通IO的话就需要端口复用,那么可能就会影响到下载功能。影响了下载功能就意味着下次再下载代码时需要手动按住RST按键然后下载代码后立即松开RST。
但是还是有办法在不影响下载功能的情况下正常使用外设的:
举个例子,我使用的板子的蜂鸣器连接在PB4,我要正常使用蜂鸣器的话可以通过重映射的方式完全使能jtag但是不让引脚默认复位:
void beep_init()
{
//PB4上电默认为下载复位引脚,需要分时复用为普通IO
GPIO_InitTypeDef GPIO_InitType;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
GPIO_InitType.GPIO_Pin=GPIO_Pin_4;
GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitType.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitType);
}
这样配置后就可以正常使用了。如果你的是有源蜂鸣器的话一个高电平就可以推动蜂鸣器了,如果是无源蜂鸣器就是需要PWM推动:
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_4);
delay_ms(50);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
delay_ms(50);
}
其中delay_ms(50);是我使用滴答定时器写的一个延时函数:
#include "stm32f10x.h"
#include "delay_ms.h"
uint16_t systicks;
void delay_init()
{
SysTick_Config(SystemCoreClock/1000);
/*
SystemCoreClock=72mhz
SysTick_Config的入口参数是两次溢出中断中间的周期数。
周期为1/SystemCoreClock,计数次数为SystemCoreClock/1000,故两次溢出中断之间为1ms
*/
}
/*
在stm32f10x_it.c的SysTick_Handler函数外有systicks的外部变量声明,每发生一次溢出中断就把该变量值减1
*/
void delay_ms(uint16_t counter)
{
systicks=counter;
while(systicks!=0);
}
stm32f10x_it.c内改动为: