完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
配置PA4 ADC引脚,将PA2代替key功能,一脚接地一脚接PA2,想实现在另一key按键控制oled屏同时(使用了PA1),如果杜邦线连接了地与PA2,可以在oled屏幕上显示读取的ADC值程序如下 运行无误但是PA2连接时无法实现预期功能,PA1正常运行
请大佬解答~谢谢 #include "gd32f30x.h" #include "systick.h" #include #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])); } } } |
|
相关推荐
10个回答
|
|
用万用表测测通断吧,然后再测测这个IO的电平变化,也许是根本没变化,所以按键没反应
|
|
|
|
使用调试工具(如逻辑分析仪或示波器)来检查PA2引脚的实际电平变化,以确认硬件连接和软件配置是否正确
|
|
|
|
确保在读取PA2引脚状态时使用了正确的函数或方法。例如,在GD32的固件库中,可能需要调用gpio_input_bit_get函数来读取引脚状态
|
|
|
|
确保GPIO模块的时钟已经正确启用。在GD32中,通常需要调用类似rcu_periph_clock_enable的函数来启用GPIO时钟
|
|
|
|
按键在按下和释放时可能会产生抖动,导致误检测。可以在软件中实现消抖逻辑,例如通过延时或多次采样来确认按键状态
|
|
|
|
如果使用中断来检测按键按下事件,确保正确配置了中断,并且中断服务程序(ISR)正确处理按键事件
|
|
|
|
按键硬件连接如果接触不良可能会这样,检查按键是否正确连接到PA2引脚。确保按键没有虚焊或短路,且按键的另一端正确连接到地(GND)或电源(VCC)
|
|
|
|
是不是外部电路有问题啊?比如有上拉/下拉电阻配置等等,按键通常需要外部或内部上拉/下拉电阻
|
|
|
|
引脚配置错误可能会这样,请确保在初始化代码中正确配置了PA2引脚为输入模式
|
|
|
|
从您提供的代码和描述来看,您正在尝试使用GD32F303RCT6微控制器的PA4引脚作为ADC输入,同时将PA2引脚用作按键输入。您提到当PA2连接时,无法实现预期功能,而PA1正常运行。以下是一些可能的原因和解决方案:
1. **引脚配置问题**:确保您已经正确配置了PA2引脚作为输入模式,并且启用了内部上拉电阻。如果没有正确配置,PA2引脚可能无法正确读取按键状态。 2. **中断配置问题**:如果您使用的是外部中断来检测按键状态,确保您已经正确配置了PA2的外部中断,并在中断服务程序中正确处理中断。 3. **ADC配置问题**:确保您没有同时将PA2配置为ADC输入和GPIO输入,这可能会导致冲突。您需要在ADC和GPIO之间做出选择,或者使用不同的引脚。 4. **代码逻辑问题**:检查您的代码逻辑,确保在读取ADC值和处理按键输入时没有逻辑错误。特别是检查是否有任何条件判断或状态更新可能导致PA2的功能不正常。 5. **硬件连接问题**:检查您的硬件连接,确保PA2引脚没有短路或接触不良的情况。 6. **电源和地线问题**:确保您的电源和地线连接正确,没有噪声或不稳定的电源供应可能导致PA2引脚功能不正常。 7. **代码示例**:您没有提供完整的代码,因此无法确定是否有代码层面的问题。如果您能提供更详细的代码,可能更容易找到问题所在。 请根据上述可能的原因检查您的硬件和软件配置,并尝试解决问题。如果问题仍然存在,您可能需要提供更详细的代码和硬件连接图,以便进一步分析。 |
|
|
|
只有小组成员才能发言,加入小组>>
348 浏览 1 评论
543 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
786 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
658 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1140 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
76浏览 29评论
252浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
261浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
209浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
67浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 15:59 , Processed in 1.170943 second(s), Total 68, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号