打印

GD32为什么用PA2代替key按键功能不成功

[复制链接]
4611|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kk93|  楼主 | 2024-7-25 09:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
配置PA4 ADC引脚,将PA2代替key功能,一脚接地一脚接PA2,想实现在另一key按键控制oled屏同时(使用了PA1),如果杜邦线连接了地与PA2,可以在oled屏幕上显示读取的ADC值程序如下 运行无误但是PA2连接时无法实现预期功能,PA1正常运行
请大佬解答~谢谢

#include "gd32f30x.h"
#include "systick.h"
#include <stdio.h>
#include "oled.h"
extern uint8_t IntFlag;//进入中断服务程序标志,在EXTI1_IRQHandler()函数置位

// 定义一个变量来跟踪当前显示的行  
static uint8_t currentLine = 0;  

// 定义一个数组来存储要显示的信息的索引或字符串指针  
static const uint8_t chineseMessages[][2] = {  
    {12, 0}, //   
    {30, 1}, //
    {48, 2}, //
    {66, 3}, //   
    {84, 4}, //   
    {102, 5} //   
};  

static uint8_t *englishMessages[] = {  
    "HUZHOU",  
    "TEL:12345678"  
};  


uint16_t adc_value;
uint16_t Vol_Value;

float Vol_Value1;


void adc_config(void)
{
   /* reset ADC */
    adc_deinit(ADC1);

//    /* ADC mode config */
    adc_mode_config(ADC_MODE_FREE);
    /* ADC continous function enable */
    adc_special_function_config(ADC1, ADC_CONTINUOUS_MODE, ENABLE);


    /* ADC data alignment config */
    adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
      /* ADC resolusion 6B */
    // adc_resolution_config(ADC1, ADC_RESOLUTION_6B);
    /* ADC channel length config */
    adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 1);


    /* ADC regular channel config */
    adc_regular_channel_config(ADC1, 0, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5);



    /* ADC trigger config */
     adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
     adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE);


    /* enable ADC interface */
    adc_enable(ADC1);  
    delay_1ms(1);
    /* ADC calibration and reset calibration */
    adc_calibration_enable(ADC1);
    /* enable ADC interface */   
        //        adc_software_trigger_enable(ADC0,ADC_REGULAR_CHANNEL);

}



int main(void)
{
        rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1);//设置主频120M(#define __SYSTEM_CLOCK_120M_PLL_HXTAL           (uint32_t)(120000000),8M外部晶振  (#define HXTAL_VALUE    ((uint32_t)8000000))
        systick_config();//1ms systick
        rcu_periph_clock_enable(RCU_AF); //AF时钟使能
        delay_1ms(1000);//等待1000ms
        gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE);//下载口NJTRST引脚当做普通I/O口
        rcu_periph_clock_enable(RCU_GPIOB);//PB时钟使能
        gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//PB4配置成输出
       
        //配置PA4 ADC引脚
       
         rcu_periph_clock_enable(RCU_GPIOA);
         gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
       
        /* enable ADC1 clock */
        rcu_periph_clock_enable(RCU_ADC1);
                /* config ADC clock */
        rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);
       
        //配置ADC
        adc_config();
        adc_software_trigger_enable(ADC1, ADC_REGULAR_CHANNEL);
        OLED_Init();//OLED初始化  
        OLED_Clear();//OLED清屏
       
        gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_1);//PA1配置成上拉输入
        nvic_irq_enable(EXTI1_IRQn, 2U, 0U);//enable and set key EXTI interrupt to the lowest priority
        gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_1);//connect key EXTI line to key GPIO pin
        exti_init(EXTI_1, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//下降沿中断
        exti_interrupt_flag_clear(EXTI_1);//清中断标志
       
       
        //PA2给ADC
        gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_2);//PA2配置成上拉输入
        nvic_irq_enable(EXTI2_IRQn, 2U, 0U);//enable and set key EXTI interrupt to the lowest priority
        gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_2);//connect key EXTI line to key GPIO pin
        exti_init(EXTI_2, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//下降沿中断
        exti_interrupt_flag_clear(EXTI_2);//清中断标志
       
       
       
    while (1)  
    {  
                if (gpio_input_bit_get(GPIOA, GPIO_PIN_2) == RESET && IntFlag == 0x55)   //ADC显示电压 需要换个接口
                {
                        adc_flag_clear(ADC1,ADC_FLAG_EOC);//清ADC结束标志
                        while(SET != adc_flag_get(ADC1,ADC_FLAG_EOC))
                                {//判断是否结束
                                        adc_value = ADC_RDATA(ADC1);//读取ADC寄存器值
                                        Vol_Value=adc_value*3300/4095/1000;//寄存器值转换成电压值

                                        //Vol_Value1=330;
                                        OLED_Clear();//OLED清屏
                                        OLED_ShowNum(5,2,Vol_Value1,4,32);
                                        delay_1ms(1000);
                                }//等待5秒
                }
               
                       
                       
        if (gpio_input_bit_get(GPIOA, GPIO_PIN_1) == RESET && IntFlag == 0x55)   //信息显示
        {  
            // 清除中断标志(重要,防止重复触发)  
            IntFlag = 0; // 假设这是一个合适的清零操作  

            OLED_Clear();  
            gpio_bit_set(GPIOB, GPIO_PIN_4);  
                       

            // 根据currentLine的值显示相应的信息  
            if (currentLine < sizeof(chineseMessages) / sizeof(chineseMessages[0]))  
            {  
                                OLED_ShowCHinese(chineseMessages[currentLine][0], 0, chineseMessages[currentLine][1]);  
            }  
            else if (currentLine >= sizeof(chineseMessages) / sizeof(chineseMessages[0]) &&  
                     currentLine < sizeof(chineseMessages) / sizeof(chineseMessages[0]) + sizeof(englishMessages) / sizeof(englishMessages[0]))  
            {  
                if((currentLine - sizeof(chineseMessages) / sizeof(chineseMessages[0]))==0)
                                {
                                        OLED_ShowCHinese(12,0,0);//显示中文(浙)
                                        OLED_ShowCHinese(30,0,1);//显示中文(江)
                                        OLED_ShowCHinese(48,0,2);//显示中文(力)
                                        OLED_ShowCHinese(66,0,3);//显示中文(控)
                                        OLED_ShowCHinese(84,0,4);//显示中文(科)
                                        OLED_ShowCHinese(102,0,5);//显示中文(技)
                                        OLED_ShowString(21, 3, englishMessages[currentLine - sizeof(chineseMessages) / sizeof(chineseMessages[0])]);  
                                }
                                if((currentLine - sizeof(chineseMessages) / sizeof(chineseMessages[0]))==1)
                                {
                                        OLED_ShowCHinese(12,0,0);//显示中文(浙)
                                        OLED_ShowCHinese(30,0,1);//显示中文(江)
                                        OLED_ShowCHinese(48,0,2);//显示中文(力)
                                        OLED_ShowCHinese(66,0,3);//显示中文(控)
                                        OLED_ShowCHinese(84,0,4);//显示中文(科)
                                        OLED_ShowCHinese(102,0,5);//显示中文(技)
                                        OLED_ShowString(21,3,(u8 *)"HUZHOU*ANJI");//显示字符 这里都是先列后行
                                        OLED_ShowString(16, 6, englishMessages[currentLine - sizeof(chineseMessages) / sizeof(chineseMessages[0])]);  
                                }
            }  

            delay_1ms(100); // 假设这里延迟1秒,以便观察显示结果  
            gpio_bit_reset(GPIOB, GPIO_PIN_4);  

            // 更新currentLine以显示下一行(如果有的话)  
            currentLine = (currentLine + 1) % (sizeof(chineseMessages) / sizeof(chineseMessages[0]) + sizeof(englishMessages) / sizeof(englishMessages[0]));  
        }  
    }  
}




使用特权

评论回复
沙发
shenxiaolin| | 2024-7-29 22:16 | 只看该作者
感谢分享

使用特权

评论回复
板凳
地瓜patch| | 2024-7-31 15:25 | 只看该作者
io配置问题

使用特权

评论回复
地板
小小蚂蚁举千斤| | 2024-7-31 22:01 | 只看该作者
应该是配置问题或者IO没有连接硬件

使用特权

评论回复
5
laocuo1142| | 2024-8-14 16:38 | 只看该作者
引脚配置错误

使用特权

评论回复
6
flycamelaaa| | 2024-8-14 19:00 | 只看该作者
检查是否有任何引脚错接或短路的情况。

使用特权

评论回复
7
probedog| | 2024-8-14 21:49 | 只看该作者
检查是否正确调用了库函数来配置PA2引脚和相关功能。

使用特权

评论回复
8
powerantone| | 2024-8-14 22:00 | 只看该作者
外部电路问题

使用特权

评论回复
9
stormwind123| | 2024-8-14 23:56 | 只看该作者
更新固件版本

使用特权

评论回复
10
d1ng2x| | 2024-8-31 11:01 | 只看该作者
在使用GD32微控制器时,如果尝试使用PA2引脚作为按键输入,但功能不成功,可能是你的IO没连接好吧

使用特权

评论回复
11
b5z1giu| | 2024-8-31 11:34 | 只看该作者
引脚配置错误可能会这样,请确保在初始化代码中正确配置了PA2引脚为输入模式

使用特权

评论回复
12
cen9ce| | 2024-8-31 11:59 | 只看该作者
是不是外部电路有问题啊?比如有上拉/下拉电阻配置等等,按键通常需要外部或内部上拉/下拉电阻

使用特权

评论回复
13
ex7s4| | 2024-8-31 12:28 | 只看该作者
按键硬件连接如果接触不良可能会这样,检查按键是否正确连接到PA2引脚。确保按键没有虚焊或短路,且按键的另一端正确连接到地(GND)或电源(VCC)

使用特权

评论回复
14
g0d5xs| | 2024-8-31 13:31 | 只看该作者
如果使用中断来检测按键按下事件,确保正确配置了中断,并且中断服务程序(ISR)正确处理按键事件

使用特权

评论回复
15
kaif2n9j| | 2024-8-31 13:48 | 只看该作者
按键在按下和释放时可能会产生抖动,导致误检测。可以在软件中实现消抖逻辑,例如通过延时或多次采样来确认按键状态

使用特权

评论回复
16
lix1yr| | 2024-8-31 14:02 | 只看该作者
确保GPIO模块的时钟已经正确启用。在GD32中,通常需要调用类似rcu_periph_clock_enable的函数来启用GPIO时钟

使用特权

评论回复
17
liu96jp| | 2024-8-31 15:16 | 只看该作者
确保在读取PA2引脚状态时使用了正确的函数或方法。例如,在GD32的固件库中,可能需要调用gpio_input_bit_get函数来读取引脚状态

使用特权

评论回复
18
suw12q| | 2024-8-31 16:33 | 只看该作者
使用调试工具(如逻辑分析仪或示波器)来检查PA2引脚的实际电平变化,以确认硬件连接和软件配置是否正确

使用特权

评论回复
19
w2nme1ai7| | 2024-8-31 17:18 | 只看该作者
用万用表测测通断吧,然后再测测这个IO的电平变化,也许是根本没变化,所以按键没反应

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝