-
GD32E230的ADC可靠不? sos
我想用 TIMER14 CH0 触发 ADC(扫描转换模式),就怎么触发不了。高手帮我看看哪错了 #include "gd32e23x_adc.h" #include "gd32e23x_dma.h" #include "gd32e23x_gpio.h" #include "gd32e23x_timer.h" static volatile uint16_t data[4]; static void rcuConfig(); static void adcConfig(); static void dmaConfig(); static void portConfig(); static void timerConfig(); void main() { rcuConfig(); timerConfig(); portConfig(); dmaConfig(); adcConfig(); timer_enable(TIMER14); gpio_bit_set(GPIOB, GPIO_PIN_4); while (1) ; } void rcuConfig() { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_ADC); rcu_periph_clock_enable(RCU_DMA); rcu_periph_clock_enable(RCU_TIMER14); rcu_adc_clock_config(RCU_ADCCK_AHB_DIV3); } void adcConfig() { adc_special_function_config(ADC_SCAN_MODE, ENABLE); adc_dma_mode_enable(); adc_channel_length_config(ADC_REGULAR_CHANNEL, 4U); adc_regular_channel_config(1U, ADC_CHANNEL_3, ADC_SAMPLETIME_1POINT5); adc_regular_channel_config(2U, ADC_CHANNEL_4, ADC_SAMPLETIME_1POINT5); adc_regular_channel_config(3U, ADC_CHANNEL_8, ADC_SAMPLETIME_1POINT5); adc_regular_channel_config(4U, ADC_CHANNEL_9, ADC_SAMPLETIME_1POINT5); adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE); adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_T14_CH0); adc_enable(); for (uint16_t i = 0; i < 1000; ++i) ; adc_calibration_enable(); } void dmaConfig() { dma_parameter_struct initParam; initParam.periph_addr = 0x4001244CU; // ADC_RDATA initParam.periph_inc = DMA_PERIPH_INCREASE_DISABLE; initParam.memory_addr = (uint32_t)data; initParam.memory_inc = DMA_MEMORY_INCREASE_ENABLE; initParam.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; initParam.memory_width = DMA_MEMORY_WIDTH_16BIT; initParam.direction = DMA_PERIPHERAL_TO_MEMORY; initParam.number = 4U; initParam.priority = DMA_PRIORITY_HIGH; dma_init(DMA_CH0, &initParam); dma_circulation_enable(DMA_CH0); dma_interrupt_enable(DMA_CH0, DMA_INT_FTF); dma_interrupt_flag_clear(DMA_CH0, DMA_INT_FLAG_FTF); nvic_irq_enable(DMA_Channel0_IRQn, 1); dma_channel_enable(DMA_CH0); } void portConfig() { gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_3); gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4); gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0); gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4); // LED } void timerConfig() { timer_parameter_struct initParam; initParam.prescaler = 71; initParam.alignedmode = TIMER_COUNTER_EDGE; initParam.counterdirection = TIMER_COUNTER_UP; initParam.period = 99; initParam.clockdivision = TIMER_CKDIV_DIV1; initParam.repetitioncounter = 0U; timer_init(TIMER14, &initParam); timer_oc_parameter_struct ocParam; ocParam.outputstate = TIMER_CCX_ENABLE; ocParam.ocpolarity = TIMER_OC_POLARITY_HIGH; timer_channel_output_config(TIMER14, TIMER_CH_0, &ocParam); timer_channel_output_pulse_value_config(TIMER14, TIMER_CH_0, 2U); timer_channel_output_mode_config(TIMER14, TIMER_CH_0, TIMER_OC_MODE_PWM1); } void DMA_Channel0_IRQHandler() { static uint32_t i = 0; if (dma_interrupt_flag_get(DMA_CH0, DMA_INT_FLAG_FTF)) { dma_interrupt_flag_clear(DMA_CH0, DMA_INT_FLAG_FTF); ++i; if (i == 10000) { i = 0; gpio_bit_toggle(GPIOB, GPIO_PIN_4); } } }
2120浏览量 0回复量 关注量 -
HC32L110C6UA端口中断问题
华大HC32L110C6UA芯片配置P03端口输入下降沿中断,一旦触发中断就会一直进入端口中断,有对M0P_GPIO->P3ICLR写入0操作,并读取M0P_GPIO->P3ICLR和M0P_GPIO->P0STAT_f 寄存器发现值并没有变化。不知道是有哪里没有设置好,各位大神帮忙看看!如下是程序过程: void Gpio_IRQHandler(uint8_t u8Param){ uint32_t read_stat=0; switch(u8Param) { case 0: { } break; case 1: { } break; case 2: { } break; case 3: { } break; default:; break; } *((uint32_t *)((uint32_t)&M0P_GPIO->P3ICLR + u8Param * 0x40)) = 0; read_stat=*((uint32_t *)((uint32_t)&M0P_GPIO->P3ICLR + u8Param * 0x40)); read_stat=*((uint32_t *)((uint32_t)&M0P_GPIO->P0STAT_f + u8Param * 0x40)); } int32_t main(void) { Gpio_InitIOExt(0, 3, GpioDirIn, FALSE, FALSE, FALSE, FALSE); Gpio_ClearIrq(0, 3); //上升沿 Gpio_EnableIrq(0, 3, GpioIrqFalling); EnableNvic(PORT0_IRQn, DDL_IRQ_LEVEL_DEFAULT, TRUE); while(1) { } }
1424浏览量 2回复量 关注量 -
各位大神,一个IO口如何检测充电芯片的各种状态 赏100家园币
[i=s] 本帖最后由 21562644322 于 2020-12-23 19:10 编辑 [/i] 如图,一个单片机IO口(可内部上下拉)检测4056的CHRG信号(充电时低,常态及充满为高阻态),需要做唤醒、判断插入充电、判断充满、判断拔出,如何实现,求解
19822浏览量 6回复量 关注量 -
stm8s003 的 I/O口自动变成低电平
使用stm8s003的PD2,PD3,PC7当成普通的按键输入检测端口,端口设置为内部上拉,并且在每个端口直接接了一个104p电容到地。现在线路板做通电48小时老化测试,有2%的线路板有误动作,不是上电的时间产出误动作,没有规律,有时候几个小时,有时候几十个小时才会出现。检查都是输入端口变为了低电平(只有按下按键,端口才会是低电平)怀疑104漏电,拆下单独测试电容是好的,焊回到线路板又好了,电容会时好时坏吗? GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT);//PC7上拉输入 GPIO_Init(GPIOD, GPIO_PIN_LNIB, GPIO_MODE_IN_PU_NO_IT);//PD0-PD3上拉输入
1721浏览量 8回复量 关注量 -
stm32l476移植鸿蒙系统求助
[i=s] 本帖最后由 walker2048 于 2020-12-15 10:17 编辑 [/i] [align=left][align=left]本人菜**一只,尝试着移植鸿蒙2.0系统到stm32l476rg_nucleo开发板。现在碰到一些问题,想问下论坛里的大佬是否可以给点提示,非常感谢。[/align][align=left]环境配置描述:[/align][align=left]目前已完成至设置好clang+gcc工具链(最后ld时使用arm-none-eabi-gcc)配置,编译参数根据cubeMX生成的makefile文件修改好了。该工具链与编译参数使用在cubeMX生成的标准程序里可正常运行(点灯OK,延时500毫秒OK,printf重定向串口输出OK)。[/align][align=left]---------------------------[/align][align=left]参数设置如下[/align][align=left]defines = -DUSE_HAL_DRIVER -DSTM32L476xx[/align][align=left]asmflags = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard[/align][align=left]# -fshort-enums -target arm-none-eabi 这两个参数是clang用的[/align][align=left]cflags = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fshort-enums -target arm-none-eabi -fPIC[/align][align=left]cflags_c = -Og -Wall -fdata-sections -ffunction-sections -g -gdwarf-2[/align][align=left]ldflags = -T ../../vendor/st/board/stm32l476rg/STM32L476RGTx_FLASH.ld -lc -lm -lnosys -specs=nano.specs -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -Og -Wall -fdata-sections -ffunction-sections -g -gdwarf-2[/align][align=left]---------------------------[/align][align=left]问题描述如下,mcu的时钟定义设置为最高速80M,在cubeMX生成的标准程序里(不管是gcc编译或者clang编译),SystemCoreClock可顺利更新为80M,程序正常。但是在移植到鸿蒙的代码中,HAL库无法更新SystemCoreClock变量,不管是如何修改cubeMX的时钟定义(降频改配置,修改UART2时钟信号源),均无法正常运行点灯与串口输出功能,HAL_Delay功能也出错。目前判断是只要使用到SystemCoreClock变量的,都会出错。自己在单步调试中将SystemCoreClock变量赋值为80M,也无法正常运行程序。[/align][align=left]--------------------------[/align][align=left]想求助一下论坛里的大佬,是否能帮忙看一下到底是什么地方有问题。[/align][align=left]源码地址附上:https://gitee.com/walker2048/hmos_iot,请切换到clang_stm32分支。[/align][align=left]编译时需要LLVM,arm-none-eabi-gcc,gn,ninja工具,以及python3.7以上环境。Debug时需要Openocd和arm-none-eabi-gdb。[/align][align=left]编译命令为python build.py stm32l476rg_nucleo(在源码根目录执行)。[/align][align=left]如果大家懒得搭编译环境,可以使用我创建好的Docker镜像(arm-none-eabi-gcc工具链需要自行下载配置)[/align][align=left]镜像运行命令:docker run -it --name build -v "D:/hmos_iot":"/mnt" walker2048/hm_build:slim_iot[/align][/align]
13414浏览量 12回复量 关注量 -
关于GD32F450串口irDA收发以及串口配置问题
最近在做一个关于串口irDA的红外通信模块,GD32F450做串口初始化的时候 我使能了串口收发以及红外功能,但是数据能发不能接收是怎么一回事呢?不知道有没有大佬用过GD 的irDA??串口初始化代码如下: void gd_eval_com_init(uint32_t com) { /* enable GPIO clock */ uint32_t COM_ID; if(EVAL_COM1 == com) { COM_ID = 0U; } rcu_periph_clock_enable( EVAL_COM_GPIO_CLK); /* enable USART clock */ rcu_periph_clock_enable(COM_CLK[COM_ID]); /* connect port to USARTx_Tx */ gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_TX_PIN[COM_ID]); /* connect port to USARTx_Rx */ gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_RX_PIN[COM_ID]); /* configure USART Tx as alternate function push-pull */ gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,COM_TX_PIN[COM_ID]); gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_TX_PIN[COM_ID]); /* configure USART Rx as alternate function push-pull */ gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,COM_RX_PIN[COM_ID]); gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_RX_PIN[COM_ID]); /* USART configure */ usart_deinit(com); usart_baudrate_set(com,115200U); usart_stop_bit_set(com, USART_STB_1BIT); usart_receive_config(com, USART_RECEIVE_ENABLE); usart_transmit_config(com, USART_TRANSMIT_ENABLE); // usart_irda_lowpower_config(com, USART_IRLP_NORMAL); usart_irda_mode_enable(com); usart_enable(com); /* USART interrupt configuration */ nvic_irq_enable(UART3_IRQn, 1, 1); /* enable USART0 receive interrupt */ usart_interrupt_enable(UART3, USART_INTEN_RBNEIE); // /* enable USART0 transmit interrupt */ // usart_interrupt_enable(USART0, USART_INTEN_TBEIE); }
1091浏览量 1回复量 关注量 -
RM48的GIO问题 sos
我在测试GIO的时候,程序实现的是在GIOB[1] 或GIOB[0]检测到高电平(3.3v)输入的时候,执行闪灯。 在DEBUG下正常,能够闪灯,但是在实际中 却没有闪灯。 void main(void) { uint32_t RST_status2=4; uint32_t RST_status1=5; uint32_t RST_MON_Int=6; hetInit(); gioInit(); LED8_ON(); //HET_8 LED28_ON(); //HET_28 wait(200000); LED28_OFF(); LED8_OFF(); wait(200000); LED8_ON(); LED28_ON(); wait(2000000); LED8_OFF(); LED28_OFF(); wait(2000000); LED8_ON(); LED28_ON(); wait(2000000); LED8_OFF(); LED28_OFF(); hetPORT1->DSET |= (1< hetPORT1->DSET |= (1< while(1) { RST_status2= gioGetBit(gioPORTB,0); RST_status1= gioGetBit(gioPORTB,1); RST_MON_Int= gioGetBit(gioPORTA,6); if(1== RST_status1|| 1==RST_status2) { uint32_t i=0; for(i=0;i<10;i++) { LED8_ON(); wait(200000); LED8_OFF(); } } RST_status2=0; RST_status1=0; if(1 == RST_MON_Int) { uint32_t j=0; for(j=0;j<20;j++) { LED28_ON(); wait(200000); LED28_OFF(); } } RST_MON_Int=0; } }
678浏览量 0回复量 关注量 -
NUC980驱动SDIO的WIFI模块失败
自己画的NUC980板子,板载了AP6181模块,内部为43362,驱动失败。 新唐有没有提供此类WIFI模块的配置方法。 有人用NUC980驱动成功过SDIO的WIFI模块吗,NUC980所提供的内核源码支持哪几种SDIO的WIFI模块?
2576浏览量 11回复量 关注量 -
这种外部触发IO电路有啥严重问题不?
现场反馈说是低电平触发不稳定,得延时几个ms才能稳定捕获,外部触发电缆大概 10米长,周围都是24V的直流电机启动和断开,低电平是触发的一些位置传感器信号
3541浏览量 8回复量 关注量