打印
[技术问答]

hc32l19x 串口0只能收不能发

[复制链接]
1830|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file main.c
**
** A detailed description is available at
** @link Sample Group Some description @endlink
**
**   - 2016-02-16  1.0  XYZ First version for Device Driver Library of Module.
**
******************************************************************************/

/******************************************************************************
* Include files
******************************************************************************/
#include "uart.h"
#include "gpio.h"

/******************************************************************************
* Local pre-processor symbols/macros ('#define')                           
******************************************************************************/
#define SLAVEADDR   0xc0

/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/

/******************************************************************************
* Local type definitions ('typedef')                                         
******************************************************************************/

/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/

/******************************************************************************
* Local variable definitions ('static')                                      *
******************************************************************************/
volatile uint8_t u8TxData[2] = {0xaa,0x55};
volatile uint8_t u8RxData[2] = {0x00};
uint8_t u8TxCnt=0,u8RxCnt=0;

/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
void App_PortInit(void);
void App_UartCfg(void);

//时钟配置为24MHz
void App_ClkCfg(void)
{
    M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C08ul)));    //Loader 4MHz Trimming value
    M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C06ul)));    //Loader 8MHz Trimming value
    M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C04ul)));    //Loader 16MHz Trimming value
    M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C00ul)));    //Loader 24MHz Trimming value
    SystemCoreClock = 24000000;
}

/**
******************************************************************************
** \brief  Main function of project
**
** \return uint32_t return value, if needed
**
** This sample
**
******************************************************************************/

int32_t main(void)
{  
                //App_ClkCfg();
       
    //UART端口初始化
    App_PortInit();

    //串口模块配置
    App_UartCfg();

    //发送地址后,触发中断,后续发送数据
    M0P_UART0->SBUF = (1<<8)|SLAVEADDR;              
    while(1);
}

//UART0中断
void Uart0_IRQHandler(void)
{
    if(Uart_GetStatus(M0P_UART0, UartRC))
    {
        Uart_ClrStatus(M0P_UART0, UartRC);              //清除中断状态位
        u8RxData[u8RxCnt]=Uart_ReceiveData(M0P_UART0);  //发送数据
        u8RxCnt++;
        if(u8RxCnt>1)                                   //如果已接收两个字节
        {
            Uart_DisableIrq(M0P_UART0,UartRxIrq);       //禁止接收中断
        }
    }

    if(Uart_GetStatus(M0P_UART0, UartTC))
    {
        Uart_ClrStatus(M0P_UART0, UartTC);              //清除中断状态位
        Uart_SendDataIt(M0P_UART0, u8TxData[u8TxCnt++]);//发送数据
        if(u8TxCnt>1)                                   //如果已发送两个字节
        {
            u8TxCnt = 0;
            u8RxCnt = 0;
            Uart_DisableIrq(M0P_UART0,UartTxIrq);       //禁止发送中断
            Uart_EnableIrq(M0P_UART0,UartRxIrq);        //使能接收中断
        }
    }

}

//串口模块配置
void App_UartCfg(void)
{
    stc_uart_cfg_t  stcCfg;
    stc_uart_baud_t stcBaud;

    DDL_ZERO_STRUCT(stcCfg);
    DDL_ZERO_STRUCT(stcBaud);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE); ///<使能UART0外设时钟门控开关

    ///<UART Init
    stcCfg.enRunMode        = UartMskMode3;                 ///<模式3
    stcCfg.enStopBit        = UartMsk1bit;                  ///<1bit停止位
    stcCfg.enMmdorCk        = UartMskDataOrAddr;            ///<多机模式时
    stcCfg.stcBaud.u32Baud  = 9600;                         ///<波特率9600
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;              ///<通道采样分频配置
    stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq();        ///</<获得外设时钟(PCLK)频率值
    Uart_Init(M0P_UART0, &stcCfg);                          ///<串口初始化

    ///<UART中断使能
    Uart_ClrStatus(M0P_UART0,UartRC);                       ///<清接收请求
    Uart_ClrStatus(M0P_UART0,UartTC);                       ///<清接收请求
    Uart_EnableIrq(M0P_UART0,UartTxIrq);                    ///<使能串口接收中断   
    EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE);              ///<系统中断使能

}

//串口引脚配置
void App_PortInit(void)
{
    stc_gpio_cfg_t stcGpioCfg;

    DDL_ZERO_STRUCT(stcGpioCfg);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);  ///<使能GPIO外设时钟门控开关

    stcGpioCfg.enDir = GpioDirOut;
                stcGpioCfg.enPu = GpioPuEnable;
          stcGpioCfg.enDrv = GpioDrvH;
                stcGpioCfg.enOD = GpioOdEnable;
          stcGpioCfg.bOutputVal = TRUE;
          Gpio_Init(GpioPortA,GpioPin9,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortA,GpioPin9,GpioAf1);             ///<配置PA09 为UART0 TX
       
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortA,GpioPin10,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortA,GpioPin10,GpioAf1);             ///<配置PA10 为UART0 RX
}
/******************************************************************************
* EOF (not truncated)
******************************************************************************/



使用特权

评论回复
沙发
qyzwangbin|  楼主 | 2020-12-22 18:15 | 只看该作者
有fae吗,帮忙看下,感谢

使用特权

评论回复
板凳
qyzwangbin|  楼主 | 2020-12-22 18:18 | 只看该作者
同样代码换成串口1就可以

使用特权

评论回复
地板
598330983| | 2020-12-22 23:06 | 只看该作者
好奇怪啊,是不是这个腿有什么特别之处。

使用特权

评论回复
5
qyzwangbin|  楼主 | 2020-12-23 09:20 | 只看该作者
有玩过的指导一下,感谢

使用特权

评论回复
6
嵌入小菜菜| | 2020-12-23 09:41 | 只看该作者
你这个配置的是有问题的。

使用特权

评论回复
7
名字是啥样| | 2020-12-23 11:01 | 只看该作者
感谢楼主分享代码,不错的,不错的芯片,代码也是不错的。

使用特权

评论回复
8
martinhu| | 2020-12-23 11:26 | 只看该作者
楼主是一开始就不能发送,还是后续不能发送?
看楼主的代码,在发送中断里面,发送结束后把发送中断关掉之后,没有重新打开了。
另外,Tx和Rx引脚不需要设置开漏,只要设置输入(Rx)或者输出方向(Tx),还有设置复用功能引脚就好了。

使用特权

评论回复
9
qyzwangbin|  楼主 | 2020-12-23 11:41 | 只看该作者
martinhu 发表于 2020-12-23 11:26
楼主是一开始就不能发送,还是后续不能发送?
看楼主的代码,在发送中断里面,发送结束后把发送中断关掉之 ...

是一开始就收不到
代码是原厂给的样例,我只是把输出口配置改了下。只配置为输出,也是没有收到数据

使用特权

评论回复
10
martinhu| | 2020-12-23 13:09 | 只看该作者
楼主的时钟初始化也有问题,对比手册,楼主使用的方案1缺失几步操作


使用特权

评论回复
11
martinhu| | 2020-12-23 13:11 | 只看该作者
qyzwangbin 发表于 2020-12-23 11:41
是一开始就收不到
代码是原厂给的样例,我只是把输出口配置改了下。只配置为输出,也是没有收到数据 ...

我对比了网上的驱动库样例Rev1.0.3,和你的不一样

/******************************************************************************
* Local variable definitions ('static')                                      *
******************************************************************************/
volatile static uint8_t u8RxData;
volatile static uint8_t u8TxCnt=0;
volatile static uint8_t u8RxCnt=0;

/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
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();
        
    while(1)
    {
        if(u8RxCnt>=1)
        {
            u8RxCnt = 0;
            Uart_SendDataIt(M0P_UART1, ~u8RxData); //启动UART1发送第一个字节         
        }

    }
}

//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
}

//串口配置
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_3_IRQn, IrqLevel3, TRUE);       ///<系统中断使能

}

使用特权

评论回复
12
qyzwangbin|  楼主 | 2020-12-23 13:36 | 只看该作者
martinhu 发表于 2020-12-23 13:11
我对比了网上的驱动库样例Rev1.0.3,和你的不一样

/************************************************* ...

是的, 这是串口1的程序,可以正常运行的。我试过把uart1都改为uart0也是收不到数据

使用特权

评论回复
13
qyzwangbin|  楼主 | 2020-12-23 13:37 | 只看该作者
martinhu 发表于 2020-12-23 13:09
楼主的时钟初始化也有问题,对比手册,楼主使用的方案1缺失几步操作

好的,我改一下

使用特权

评论回复
14
martinhu| | 2020-12-23 14:00 | 只看该作者
qyzwangbin 发表于 2020-12-23 13:36
是的, 这是串口1的程序,可以正常运行的。我试过把uart1都改为uart0也是收不到数据 ...

把你贴的代码拷贝下来,我的串口助手可以收到数据啊

使用特权

评论回复
15
martinhu| | 2020-12-23 14:03 | 只看该作者
你的代码设置的是MODE3,如果不是多机模式,只是想要用硬件奇偶校验功能,那么stcCfg.enMmdorCk      不应该设置为 UartMskDataOrAddr;,而是另外两个枚举



使用特权

评论回复
16
qyzwangbin|  楼主 | 2020-12-23 15:20 | 只看该作者

会不会是pa09 连到lcd的原因

使用特权

评论回复
17
bidinghong| | 2020-12-23 20:13 | 只看该作者
看看学习学习

使用特权

评论回复
18
martinhu| | 2020-12-24 09:46 | 只看该作者
qyzwangbin 发表于 2020-12-23 15:20
会不会是pa09 连到lcd的原因

单纯跑串口样例不会有影响,不信可以抓波形看看。

使用特权

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

本版积分规则

1

主题

8

帖子

0

粉丝