CH32V307 GPIO点灯 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

[文章]

CH32V307 GPIO点灯

本帖最后由 l爱学习 于 2023-3-30 10:24 编辑

1、关于GPIO
CH32V307的GPIO可配置成多种输入或输出模式,内置可关闭的上拉或下拉电阻,可以配置成推挽或开漏功能。GPIO 口还可以复用成其他功能。 GPIO可配置成8种工作模式,如下:
  1. /* Configuration Mode enumeration */
  2. typedef enum
  3. { GPIO_Mode_AIN = 0x0,
  4.   GPIO_Mode_IN_FLOATING = 0x04,
  5.   GPIO_Mode_IPD = 0x28,
  6.   GPIO_Mode_IPU = 0x48,
  7.   GPIO_Mode_Out_OD = 0x14,
  8.   GPIO_Mode_Out_PP = 0x10,
  9.   GPIO_Mode_AF_OD = 0x1C,
  10.   GPIO_Mode_AF_PP = 0x18
  11. }GPIOMode_TypeDef;
输入模式配置:
  • 模拟输入:当配置为模拟输入时,外部信号直接进入模拟输入部分,一般用于ADC引脚初始化配置。
  • 浮空输入:当配置为浮空输入时,外部信号直接流向内部,GPIO引脚呈现高阻态,一般用于配置数据传输输入引脚。
  • 下拉输入:当配置为下拉输入时,相较于浮空输入模式,GPIO引脚内部接了一个下拉电阻,此时读取电平数据为0,相当于输入低电平。
  • 上拉输入:当配置为上拉输入时,相较于浮空输入模式,GPIO引脚内部接了一个上拉电阻,此时读取电平数据为1,相当于输入高电平。
输出模式配置:
  • 开漏输出:当配置为开漏输出时,GPIO引脚无法直接输出高电平,需要外接上拉电阻方可输出高电平。
  • 推挽输出:当配置为推挽输出时,GPIO引脚可直接输出高低电平,GPIO点灯等一般就配置为推挽输出模式。
  • 开漏复用输出:当配置为开漏复用输出时,由外设控制输出高低电平,输出高电平需要外接上拉电阻,一般用于IIC引脚配置
  • 推挽复用输出:当配置为推挽复用输出时,由外设控制输出高低电平,一般用于配置定时器PWM输出、USART输出、SPI输出等。

2、GPIO点灯
GPIO点灯,主要通过控制GPIO输出高低电平来控制LED灯亮或灭。以所用测试板为例,如下图。要是LED亮,LED1和2需要为低电平方可,因此要配置LED1和2对应引脚输出电平。当输出高电平时,LED灯灭。通过控制输出高低电平即可控制LED灯闪烁。更改高低电平的输出间隔即可修改控制LED灯闪烁的快慢。

GPIO点灯程序如下:
  1. /*********************************************************************
  2. * @fn      GPIO_Toggle_INIT
  3. *
  4. * [url=home.php?mod=space&uid=2666770]@Brief[/url]   Initializes GPIOA.0
  5. *
  6. * [url=home.php?mod=space&uid=1141835]@Return[/url]  none
  7. */
  8. void GPIO_Toggle_INIT(void)
  9. {
  10.     GPIO_InitTypeDef GPIO_InitStructure = {0};

  11.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  16. }

  17. /*********************************************************************
  18. * @fn      main
  19. *
  20. * @brief   Main program.
  21. *
  22. * @return  none
  23. */
  24. int main(void)
  25. {
  26.     u8 i=0;

  27.     SystemCoreClockUpdate();
  28.     Delay_Init();
  29.     USART_Printf_Init(115200);
  30.     printf("SystemClk:%d
  31. ", SystemCoreClock);
  32.     printf( "ChipID:%08x
  33. ", DBGMCU_GetCHIPID() );
  34.     printf("GPIO Toggle TEST
  35. ");

  36.     GPIO_Toggle_INIT();

  37.     while(1)
  38.     {
  39.         Delay_Ms(250);
  40.         GPIO_WriteBit(GPIOA, GPIO_Pin_0|GPIO_Pin_1, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
  41.     }
  42. }
配置GPIO输出模式时,GPIO输出速度可配置为以下3种:2MHz、10MHz和50MHz。这3个值指的是I/O口驱动电路的响应频率而不是输出信号的频率。芯片的内部做了多个响应频率不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路。通过选取不同频率的输出驱动电路达到最佳的控制噪声和降低功耗的效果。
高频驱动电路噪声高,不需要高的输出频率时应该选择低频驱动电路,以提高系统的EMI性能。当然如果要输出较高频率的信号却选用了较低的输出驱动模块,很可能会得到失真的输出信号。例如,对于串口,假如最大波特率只需115.2kb/s,那么用2MHz的GPIO引脚频率就可以了,既省电,噪声也小。对于I2C接口,假如使用400kb/s波特率,又想留一些裕量,2MHz或许不够,可以选择10MHz的引脚频率。对于SPI接口,假如使用18Mb/s或9Mb/s的波特率,用10MHz的引脚频率显然不够了,需要选50MHz的。当然引脚频率是对输出而言的,当GPIO配置为输入模式时,输出速度配置毫无意义,因为输出驱动电路与输入端口是断开的。

3、测试现象
将程序下载到测试板之后,LED灯每隔250Ms闪烁一次,用逻辑分析仪抓取翻转波形,可以看到脉宽为250Ms,更改延时时间,即可改变LED灯闪烁的快慢。





回帖(2)

红旧衫

2023-3-30 14:14:30
讲解得很详细,感谢大佬分享!

温暖镜头

2023-3-31 09:46:09

更多回帖

×
发帖