ext-5 void GPIO1Pin23PinMuxSetup(void)含义

在阅读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灯不再闪烁。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修改输出为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
你想要将输出频率修改为666kHz。为了实现这一点,你需要相应地调整定时器的配置。以下是更新后的代码: ```c #include "config.h" #include "timer.h" #include "GPIO.h" #include "delay.h" #define Fre(X) (65536 - ((float)(22118400 / 12 / 1000000.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; GPIO_InitStructure.Mode = GPIO_OUT_PP; GPIO_Inilize(GPIO_P5, &GPIO_InitStructure); } void Timer0_config(void) { TIM_InitTypeDef TIM_InitStructure; TIM_InitStructure.TIM_Mode = TIM_16Bit; TIM_InitStructure.TIM_Priority = Priority_0; TIM_InitStructure.TIM_Interrupt = ENABLE; TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T; TIM_InitStructure.TIM_ClkOut = DISABLE; TIM_InitStructure.TIM_Value = Fre(666); TIM_InitStructure.TIM_Run = ENABLE; Timer_Inilize(Timer0, &TIM_InitStructure); } 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 = 1000000 / Data_A; // 频率 Data_C = Data_B / 10; // 高电平 Data_D = Data_B - Data_C; // 低电平 Data_E = (u16)Fre(Data_D); } } void timer0_int(void) interrupt TIMER0_VECTOR { F = ~F; Data_F = Data_E; TH0 = Data_F >> 8; TL0 = Data_F; // 输出占空比信息 printf("Output: 10%%\n"); } ``` 请注意,这里我们将频率设置为了666kHz,对应的计算公式为`Data_B = 1000000 / Data_A`。同时,我们也需要将输出占空比信息的语句保留在Timer0中断函数中。 请尝试使用这段代码,并检查输出频率是否已经被成功修改为666kHz。如果还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值