21ic问答首页 - 华大HC32L130 485接收影响AD稳定
华大HC32L130 485接收影响AD稳定
流浪的屁屁2021-06-29
问题现象:AD值会波动,波动值在0~80左右,具体如下,请教大佬有遇到过吗?
尝试分析测试试验(采用官方库例程,配置串口跟AD部分):
1.485EN脚配置为高电平,AD就稳定,再次配置成低电平,AD波动;
2.485EN脚配置到PC13或PD7,初始化配置输出低电平,AD波动;
3.485EN脚加硬件光耦隔离电路,仍旧配置输出低电平,AD波动;
4.485EN脚悬空,AD稳定;
5.485EN脚配置输出低电平,485上位机不接,AD稳定;
6.将串口(PA2/PA3)改为配置到串口0(PA9/PA10),PA2/PA3默认不配置,AD波动,PA2/PA3配置成输出,AD稳定;
7.尝试将AD优先级配置1,串口优先级默认3,AD也还是波动;
综上,初步判定是485接收导致AD波动,与优先级无关,但是,该测试板是在原先ST板上换上华大芯片改的,ST量产的没发现这个问题。
/*****************************************************************************/
/** \file main.c
**
** A detailed description is available at
** @link Sample Group Some description @endlink
**
** - 2017-05-28 LiuHL First Version
**
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "adc.h"
#include "gpio.h"
#include "bgr.h"
#include "uart.h"
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
volatile uint32_t u32AdcRestult0;
volatile uint32_t u32AdcRestult0_1;
volatile uint32_t u32AdcRestult2;
volatile uint32_t u32AdcRestult5;
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
volatile static uint8_t u8RxData;
volatile static uint8_t u8TxCnt=0;
volatile static uint8_t u8RxCnt=0;
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/******************************************************************************
* Local variable definitions ('static') *
******************************************************************************/
/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
void App_AdcPortInit(void);
void App_AdcInit(void);
void App_AdcJqrCfg(void);
void App_UartCfg(void);
void App_PortInit(void);
/**
******************************************************************************
** \brief Main function of project
**
** \return uint32_t return value, if needed
**
** This sample
**
******************************************************************************/
int32_t main(void)
{
//串口引脚配置
App_PortInit();
//串口配置
App_UartCfg();
///< ADC 采样端口初始化
App_AdcPortInit();
///< ADC模块初始化
App_AdcInit();
///< ADC插队扫描功能配置
App_AdcJqrCfg();
while(1)
{
delay1ms(100);
Adc_JQR_Start();
;
}
}
///< ADC中断服务函数
void Adc_IRQHandler(void)
{
if(TRUE == Adc_GetIrqStatus(AdcMskIrqJqr))
{
Adc_ClrIrqStatus(AdcMskIrqJqr);
u32AdcRestult0 = Adc_GetJqrResult(AdcJQRCH0MUX);
u32AdcRestult2 = Adc_GetJqrResult(AdcJQRCH1MUX);
u32AdcRestult5 = Adc_GetJqrResult(AdcJQRCH2MUX);
u32AdcRestult0_1 = Adc_GetJqrResult(AdcJQRCH3MUX);
Adc_JQR_Stop();
}
}
///< ADC采样端口初始化
void App_AdcPortInit(void)
{
///< 开启ADC/BGR GPIO外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
Gpio_SetAnalogMode(GpioPortA, GpioPin7); //PA00 (AIN0)
Gpio_SetAnalogMode(GpioPortB, GpioPin0); //PA02 (AIN2)
Gpio_SetAnalogMode(GpioPortB, GpioPin1); //PA05 (AIN5)
}
///< ADC模块初始化
void App_AdcInit(void)
{
stc_adc_cfg_t stcAdcCfg;
DDL_ZERO_STRUCT(stcAdcCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
Bgr_BgrEnable(); ///< 开启BGR
///< ADC 初始化配置
stcAdcCfg.enAdcMode = AdcScanMode; ///<采样模式-扫描
stcAdcCfg.enAdcClkDiv = AdcMskClkDiv8; ///<采样分频-1
stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk; ///<采样周期数-8
stcAdcCfg.enAdcRefVolSel = AdcMskRefVolSelAVDD; ///<参考电压选择-VCC
stcAdcCfg.enAdcOpBuf = AdcMskBufDisable; ///<OP BUF配置-关
stcAdcCfg.enInRef = AdcMskInRefDisable; ///<内部参考电压使能-关
stcAdcCfg.enAdcAlign = AdcAlignRight; ///<转换结果对齐方式-右
Adc_Init(&stcAdcCfg);
}
///< ADC插队扫描功能配置
void App_AdcJqrCfg(void)
{
stc_adc_jqr_cfg_t stcAdcJqrCfg;
DDL_ZERO_STRUCT(stcAdcJqrCfg);
///< 插队扫描模式功能及通道配置
///< 注意:扫描模式下,当配置转换次数为n时,转换通道的配置范围必须为[JQRCH(0)MUX,JQRCH(n-1)MUX]
stcAdcJqrCfg.bJqrDmaTrig = FALSE;
stcAdcJqrCfg.u8JqrCnt = 4;
Adc_JqrModeCfg(&stcAdcJqrCfg);
Adc_CfgJqrChannel(AdcJQRCH0MUX, AdcExInputCH7);
Adc_CfgJqrChannel(AdcJQRCH1MUX, AdcExInputCH8);
Adc_CfgJqrChannel(AdcJQRCH2MUX, AdcExInputCH9);
Adc_CfgJqrChannel(AdcJQRCH3MUX, AdcExInputCH7);
///< ADC 中断使能
Adc_EnableIrq();
EnableNvic(ADC_IRQn, IrqLevel1, TRUE);
///< 启动插队扫描采样
Adc_JQR_Start();
}
//UART1中断函数
void Uart1_IRQHandler(void)
{
if(Uart_GetStatus(M0P_UART1, UartRC)) //UART1数据接收
{
Uart_ClrStatus(M0P_UART1, UartRC); //清中断状态位
u8RxData = Uart_ReceiveData(M0P_UART1); //接收数据字节
u8RxCnt++;
}
if(Uart_GetStatus(M0P_UART1, UartTC)) //UART1数据发送
{
Uart_ClrStatus(M0P_UART1, UartTC); //清中断状态位
u8TxCnt++;
}
}
//串口引脚配置
void App_PortInit(void)
{
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟
///<TX
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg);
Gpio_SetAfMode(GpioPortA, GpioPin2, GpioAf1); //配置PA02 端口为URART1_TX
///<RX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortA, GpioPin3, &stcGpioCfg);
Gpio_SetAfMode(GpioPortA, GpioPin3, GpioAf1); //配置PA03 端口为URART1_RX
/// 485EN
stcGpioCfg.enDir = GpioDirOut;
stcGpioCfg.enPu = GpioPuDisable;
stcGpioCfg.enPd = GpioPuDisable;
Gpio_Init(GpioPortA, GpioPin1, &stcGpioCfg);
Gpio_ClrIO(GpioPortA, GpioPin1);
//Gpio_SetIO(GpioPortA, GpioPin1);
}
//串口配置
void App_UartCfg(void)
{
stc_uart_cfg_t stcCfg;
DDL_ZERO_STRUCT(stcCfg);
///< 开启外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);///<使能uart1模块时钟
///<UART Init
stcCfg.enRunMode = UartMskMode3; ///<模式3
stcCfg.enStopBit = UartMsk1bit; ///<1bit停止位
stcCfg.enMmdorCk = UartMskEven; ///<偶检验
stcCfg.stcBaud.u32Baud = 9600; ///<波特率9600
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<通道采样分频配置
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
Uart_Init(M0P_UART1, &stcCfg); ///<串口初始化
///<UART中断使能
Uart_ClrStatus(M0P_UART1,UartRC); ///<清接收请求
Uart_ClrStatus(M0P_UART1,UartTC); ///<清接收请求
Uart_EnableIrq(M0P_UART1,UartRxIrq); ///<使能串口接收中断
Uart_EnableIrq(M0P_UART1,UartTxIrq); ///<使能串口接收中断
EnableNvic(UART1_IRQn, IrqLevel3, TRUE); ///<系统中断使能
}
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
赞1
正如你所说,问题已解决,原因是HC的IO口最大电压只有VCC+0.3,而485是5V供电的
评论
2021-07-28
赞0
评论
2021-07-15
赞0
评论
2021-07-15
赞0
会是外部干扰么?
评论
2021-07-15
赞0
评论
2021-07-04
赞0
评论
2021-07-03
赞0
评论
2021-07-03
赞0
而且485的选择引脚, 说白了,只是一个IO电平。
想不到原因在哪里
评论
2021-07-03
您需要登录后才可以回复 登录 | 注册