ext-5 void GPIO1Pin23PinMuxSetup(void)含义

文章详细解析了如何使用StarterWare库初始化GPIO1_23管脚,通过HWREG函数写入特定地址值以配置CONTROL_CONF_GPMC_A7寄存器,从而设置管脚为GPIO功能。原始代码将寄存器值设为0x07,对应GPIO1_23。修改为0则恢复GPMC_A7功能,LED灯不再闪烁。
摘要由CSDN通过智能技术生成

在阅读starterware里控制led的代码,GPIO初始化有个这个函数

void GPIO1Pin23PinMuxSetup(void)
{
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_A(7)) = CONTROL_CONF_MUXMODE(7);
}

如果不熟悉可能看的一头雾水,这个含义是:

解释一下:

1、我们要控制的管脚是GPIO1_23这个管脚,

2、HWREG是个写地址值的函数;

        SOC_CONTROL_REGS是个通用的地址偏移量,就不说了;

        CONTROL_CONF_GPMC_A(7),是个地址offset,这里算出的值是0x840+ 7*4 = 85Ch,恰好是conf_gpmc_a7这个寄存器

3、上面说了一大堆,看下芯片管脚原理图:

看到这个GPMC_A7管脚没,就是这个conf_gpmc_a7寄存器来控制这个管脚功能,

这里将conf_gpmc_a7寄存器值 = 0x07;

07是啥功能呢??

看到管脚的斜杠没有?恰好是7个斜杠,8个值,分别对应管脚的8钟功能,0~7和图上写的一一对应了,所以7就是GPIO1_23.

4、附上这个conf_gpmc_a7寄存器详情

 低三位选择功能,恰好最多8种功能

最后:

我们可以尝试将语句修改

HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_A(7)) = CONTROL_CONF_MUXMODE(0);

选择功能为GPMC_A7,可以,发现led灯不再闪烁。

修改输出为666khz#include "config.h" #include "timer.h" #include "GPIO.h" #include "delay.h" #define Fre(X) (65536-((float)(22118400/12/100000.0)*X)) sbit F=P5^4; u16 Data_A=100; u16 Data_B; u16 Data_C; u16 Data_D; u16 Data_E; u16 Data_F; void GPIO_config(void) { GPIO_InitTypeDef GPIO_InitStructure; //结构定义 GPIO_InitStructure.Pin = GPIO_Pin_4; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作 GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP GPIO_Inilize(GPIO_P5,&GPIO_InitStructure); //初始化 } /************************ 定时器配置 ****************************/ void Timer0_config(void) { TIM_InitTypeDef TIM_InitStructure; //结构定义 TIM_InitStructure.TIM_Mode = TIM_16Bit; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask TIM_InitStructure.TIM_Priority = Priority_0; //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3 TIM_InitStructure.TIM_Interrupt = ENABLE; //中断是否允许, ENABLE或DISABLE TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE TIM_InitStructure.TIM_Value = Fre(100); //初值, TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE Timer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2,Timer3,Timer4 } /******************** 主函数**************************/ void main(void) { GPIO_config(); Timer0_config(); EA = 1; while (1) { delay_ms(10); Data_A++; if(Data_A<=100) Data_A=100; if(Data_A>=1000) Data_A=100; Data_B=100000/Data_A;//频率 Data_C=Data_B/10; //高电平 Data_D=Data_B-Data_C;//低电平 Data_E=(u16)Fre(Data_D); } } /********************* Timer0中断函数************************/ void timer0_int (void) interrupt TIMER0_VECTOR { F = ~F; Data_F =Data_E; TH0=Data_F >>8; TL0=Data_F; }
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值