STM32 F10X系列 PB4等JTAG引脚作普通IO复用方法。

##学习笔记

一.相关表格

选自stm32手册 在这里插入图片描述1.PB3,PB4,PA13,PA14,PA15引脚可根据上表复用成普通IO口。在mcu复位的时候这几个引脚被作为jtag的功能。当我们要使用这些引脚作为普通的I/O时必须进行引脚的功能复用。

二.I/O复用方法:

1.使能所要复用的I/O时钟(例子以PB4为例):
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
2.配置I/o口:
GPIO_InitTypeDef GPIO_Initstructure;//结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//上面的复用I/O时钟写在这里
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启afio时钟,见3.
GPIO_Initstructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_Initstructure.GPIO_Pin=GPIO_Pin_4;
GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);//这是复用要用到的函数,先不管见4.。
GPIO_Init(GPIOB,&GPIO_Initstructure);//gpio初始化函数初始化b口。
3.开启AFIO时钟
在更改AFIO寄存器时要使用该时钟,平常最好都写上以防万一。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启afio时钟
4.开启复用功能
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
GPIO_Remap_SWJ_NoJTRST:为相应宏定义(见表35,上面):001
此时PB4口可以作为普通I/O口使用了。

三.GPIO_PinRemapConfig中的相关宏定义:

									(表35)

GPIO_Remap_SWJ_NoJTRST —> 001
GPIO_Remap_SWJ_JTAGDisable ----> 010
GPIO_Remap_SWJ_Disable ----> 100 //PA13/14/15 PB3/4均可用;

四.具体代码实现总结:

例子为蓝桥杯的cet711板:PB4连接蜂鸣器,所以要复用PB4口完成对蜂鸣器的初始化。

void beep_init(void)//
{
	  GPIO_InitTypeDef GPIO_Initstructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//使能PB口和AFIO口的时钟
	  GPIO_Initstructure.GPIO_Mode=GPIO_Mode_Out_PP;//推完复用输出
	  GPIO_Initstructure.GPIO_Pin=GPIO_Pin_4;//选择pb4口
	  GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;//速度
	  GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);//开启复用功能
	
	  GPIO_Init(GPIOB,&GPIO_Initstructure);//GPIO初始化
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在STM32F10x系列单片机上实现IO输出MHz级别的方波,可以使用定时器和中断的方法。以下是一个基本的实现步骤: 1. 配置定时器的时钟源和分频系数,使定时器的时钟频率为期望输出频率的若干倍。 2. 配置定时器的自动重载寄存器ARR,使其值为产生期望输出频率的对应的计数值。 3. 配置定时器的比较输出模式,并使比较输出通道输出高电平。 4. 在定时器中断中,将比较输出通道的输出电平翻转一次。 5. 启动定时器。 以下是一个简单的代码示例: ``` #include "stm32f10x.h" void TIM2_IRQHandler(void) { if (TIM2->SR & TIM_SR_CC1IF) { TIM2->SR &= ~TIM_SR_CC1IF; // 清除比较匹配中断标志 GPIOA->ODR ^= GPIO_Pin_0; // 翻转PA0的输出电平 } } int main() { // 使能GPIOA和TIM2的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 配置PA0为推挽输出模式 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置TIM2为输出比较模式 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 9; // 输出10MHz方波 TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 4; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); // 启动TIM2 TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); TIM_Cmd(TIM2, ENABLE); // 配置中断优先级 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); while (1); return 0; } ``` 此代码将在PA0输出10MHz的方波。注意,输出频率受到定时器时钟频率和自动重载寄存器值的影响,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值