针对HC32L110的使用ADC进行电压数据采集,uart数据收发异常
就是使用这个hc32l110的ADC模块来进行电压数据采集,然后把数据通过uart在串口上打印。但是不知道为什么我写的代码在获取电压数据,打印出来一直为0,电路是没什么问题的。#include "ddl.h"
#include "uart.h"
#include "bt.h"
#include "lpm.h"
#include "gpio.h"
#include "adc.h"
#define T1_PORT (3)
#define T1_PIN (3)
staticuint16_t u16ScanResult;
uint8_t u8Rx**=0;
uint8_t Check**=0;
uint8_t u8RxData={0x11,0x22,0X33};
void AdcContIrqCallback(void)
{
Adc_GetScanResult(0,&u16ScanResult);
M0P_ADC->CR0_f.STATERST = 1u;
M0P_BT1->ICLR_f.TFC = 0;
}
void RxIntCallback(void)
{
u8RxData=M0P_UART1->SBUF;
u8Rx** = 1;
}
void ErrIntCallback(void)
{
}
void AdcRegIrqCallback(void)
{
}
void AdcHhtIrqCallback(void)
{
}
void AdcLltIrqCallback(void)
{
}
int32_t main(void)
{
uint16_t timer=0;
uint32_t pclk=0;
uint16_t u16ArrData2;
uint16_t u16InitCntData2;
stc_adc_cfg_t stcAdcCfg ;
stc_adc_scan_cfg_t stcAdcScanCfg ;
stc_adc_irq_t stcAdcIrq ;
stc_adc_irq_calbakfn_pt_t stcAdcIrqCalbaks;
stc_bt_config_t stcBtConfig ;
stc_uart_config_t stcConfig ;
stc_uart_irq_cb_t stcUartIrqCb ;
stc_uart_multimode_t stcMulti ;
stc_uart_baud_config_t stcBaud ;
DDL_ZERO_STRUCT(stcAdcCfg);
DDL_ZERO_STRUCT(stcAdcScanCfg);
DDL_ZERO_STRUCT(stcAdcIrq);
DDL_ZERO_STRUCT(stcAdcIrqCalbaks);
DDL_ZERO_STRUCT(stcUartIrqCb);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcBaud);
DDL_ZERO_STRUCT(stcBtConfig);
Clk_SwitchTo(ClkRCL);
Clk_SetRCHFreq(ClkFreq24Mhz);
Clk_SwitchTo(ClkRCH);
Gpio_SetAnalog(2, 4, TRUE);
Adc_Enable();
M0P_BGR->CR_f.BGR_EN = 0x1u;
M0P_BGR->CR_f.TS_EN = 0x0u;
delay100us(1);
stcAdcCfg.enAdcOpMode = AdcScanMode;
stcAdcCfg.enAdcClkSel = AdcClkSysTDiv1;
stcAdcCfg.enAdcSampTimeSel = AdcSampTime8Clk;
stcAdcCfg.enAdcRefVolSel = RefVolSelAVDD;
stcAdcCfg.bAdcInBufEn = FALSE;
stcAdcCfg.enAdcTrig0Sel = AdcTrigTimer2;
stcAdcCfg.enAdcTrig1Sel = AdcTrigDisable;
Adc_Init(&stcAdcCfg);
stcAdcIrq.bAdcIrq = TRUE;
stcAdcIrq.bAdcRegCmp = FALSE;
stcAdcIrq.bAdcHhtCmp = FALSE;
stcAdcIrq.bAdcLltCmp = FALSE;
stcAdcIrqCalbaks.pfnAdcContIrq= AdcContIrqCallback;
stcAdcIrqCalbaks.pfnAdcRegIrq = AdcRegIrqCallback;
stcAdcIrqCalbaks.pfnAdcHhtIrq = AdcHhtIrqCallback;
stcAdcIrqCalbaks.pfnAdcLltIrq = AdcLltIrqCallback;
Adc_ConfigIrq(&stcAdcIrq, &stcAdcIrqCalbaks);
Adc_EnableIrq();
Adc_CmpCfg(&stcAdcIrq);
stcAdcScanCfg.u8AdcScanModeCh =ADC_SCAN_CH1_EN;
stcAdcScanCfg.u8AdcSampCnt = 0x1;
Adc_ConfigScanMode(&stcAdcCfg, &stcAdcScanCfg);
Gpio_InitIO(T1_PORT,T1_PIN,GpioDirIn);
Gpio_InitIO(0,3,GpioDirOut);
Gpio_SetIO(0,3,1);
Gpio_InitIOExt(3,5,GpioDirOut,TRUE,FALSE,FALSE,FALSE);
Gpio_InitIOExt(3,6,GpioDirOut,TRUE,FALSE,FALSE,FALSE);
Gpio_SetFunc_UART1TX_P35();
Gpio_SetFunc_UART1RX_P36();
Clk_SetPeripheralGate(ClkPeripheralBt,TRUE);
Clk_SetPeripheralGate(ClkPeripheralUart1,TRUE);
if (Ok != Clk_SetPeripheralGate(ClkPeripheralAdcBgr, TRUE))
{
return Error;
}
stcUartIrqCb.pfnRxIrqCb = RxIntCallback;
stcUartIrqCb.pfnTxIrqCb = NULL;
stcUartIrqCb.pfnRxErrIrqCb = ErrIntCallback;
stcConfig.pstcIrqCb = &stcUartIrqCb;
stcConfig.bTouchNvic = TRUE;
stcConfig.enRunMode = UartMode3;
stcMulti.enMulti_mode = UartNormal;
stcConfig.pstcMultiMode = &stcMulti;
stcBaud.bDbaud = 0u;
stcBaud.u32Baud = 2400U;
stcBaud.u8Mode = UartMode3;
pclk = Clk_GetPClkFreq();
timer=Uart_SetBaudRate(UARTCH1,pclk,&stcBaud);
stcBtConfig.enMD = BtMode2;
stcBtConfig.enCT = BtTimer;
Bt_ClearIntFlag(TIM1);
Bt_EnableIrq(TIM1);
Bt_Init(TIM1, &stcBtConfig);
Bt_ARRSet(TIM1,timer);
Bt_Cnt16Set(TIM1,timer);
Uart_Init(UARTCH1, &stcConfig);
Uart_EnableIrq(UARTCH1,UartRxIrq);
Uart_ClrStatus(UARTCH1,UartRxFull);
Uart_EnableFunc(UARTCH1,UartRx);
stcBtConfig.enGateP = BtPositive;
stcBtConfig.enGate= BtGateDisable;
stcBtConfig.enPRS = BtPCLKDiv256;
stcBtConfig.enTog = BtTogDisable;
stcBtConfig.enCT = BtTimer;
stcBtConfig.enMD = BtMode2;
Bt_Init(TIM2, &stcBtConfig);
Bt_ClearIntFlag(TIM2);
Bt_EnableIrq(TIM2);
u16ArrData2 = 0x10000 - 9375;
u16InitCntData2 = 0x10000 - 9375;
Bt_ARRSet(TIM2, u16ArrData2);
Bt_Cnt16Set(TIM2, u16InitCntData2);
Bt_Run(TIM2);
Bt_Run(TIM1);
while(1)
{
Adc_Start();
Check** = 0;
u8RxData = (u16ScanResult >> 8 );
u8RxData = (u16ScanResult & 0xFF);
if(u8Rx**)
{
u8Rx** = 0;
if(Uart_CheckEvenOrOdd(UARTCH1,Even,u8RxData)!=Ok)
{
Check** = 1;
}
else
{
Uart_SetTb8(UARTCH1,Even,u8RxData);
Uart_SendData(UARTCH1,u8RxData);
Uart_SetTb8(UARTCH1,Even,u8RxData);
Uart_SendData(UARTCH1,u8RxData);
Uart_SetTb8(UARTCH1,Even,u8RxData);
Uart_SendData(UARTCH1,u8RxData);
}
}
}
}
data:image/png;base64,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
代码太长啦,建议把问题分割一下,缩小一下问题范围,所谓授人以鱼不如授人以渔,
你这里涉及两个主要功能,一个是ADC采集,一个是串口发送。
先排查ADC是否能正常采集到电压。使用仿真器,观察ADC结果寄存器有没有数据。
如果ADC结果寄存器没有数据,那就检查ADC的配置,比如端口配置,ADC时钟,ADC通道配置,模式配置,触发配置等等。
如果ADC结果寄存器有数据,那就检查USART配置,可以先给一组固定的数据看看能够正常打印。
如果能正常打印,就重点检查ADC结果寄存器的读取与数据转换。
以上步骤可以把问题缩小到一定的范围,你再精准的把问题提出来,大家也会有针对性的帮你解决问题了。祝好运。
u8RxData = (u16ScanResult >> 8 );
u8RxData = (u16ScanResult & 0xFF);
你认真考虑下上面这两条语句放在while死循环里直接运行会产生什么效果?
可能几个微秒就执行一次。u8RxData[]这个数组极大部分时间都是等于0.
ADC 和 UART 得分开测试。要不然都是临时工的责任。 本帖最后由 xch 于 2023-6-6 16:29 编辑
ADC 模拟信号输入引脚是哪个?
对应的初始化代码是哪段?
P24?
本帖最后由 wubangmi 于 2023-6-6 17:18 编辑
楼主这个整合能力还有待提高,还要多研究相对应的用户手册。 能在程序里边看到采集到的数据是不是正确的呢 能确定一下就是获取的电压数据是不是正确的呢 不用ad采集的话直接让串口发送固定数据 观察一下现象 楼主看一下发送数据缓冲里边的数据是什么
用示波器看一下实际发送的数据是不是正确
楼主可以先不发送 看一下采集的数据是不是正确的
页:
[1]