打印
[通用型号]

HT32单片机串口通信

[复制链接]
416|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mmbs|  楼主 | 2022-6-18 19:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 eltonchang2001 于 2022-7-11 12:02 编辑

1、添加printf函数支持

这里主要根据正点原子的串口通信实验的printf函数移植而来,printf主要是重定义fputc函数,使其把数据直接通过串口发送出来。

由于HT32与STM32存在不同之处,因此需要查阅官方的芯片手册根据USART状态寄存器的发送完成标志位更改适合HT32单片机的串口发送的判断函数。下面是HT32单片机的USART状态寄存器,其中第九位是发送完成标志位。

2、更改串口中断处理函数

官方的串口中断处理函数个人感觉不太好用,因此我也根据正点原子的串口接收函数改成了原子的风格,而且个人感觉要好用一点。

(二)实验例程1、printf函数
#pragma import(use_no_semihosting)             
//标准库需要的支持函数                 
struct FILE
{
    int handle;
};

FILE __stdout;
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
    x = x;
}
//重定义fputc函数
int fputc(int ch, FILE f)
{
    while((COM1_PORT->SR&0X0100)==0);//循环发送,直到发送完毕   
    COM1_PORT->DR = (u8) ch;
    return ch;
}

2、串口初始化函数
/*实现函数*
函数说明:配置usart串口
*/
void USART_Configuration(void)
{
    USART_InitTypeDef USART_InitStructure;

    CKCU_PeripClockConfig_TypeDef CKCUClock= {{0}};
    CKCUClock.Bit.AFIO = 1;
    COM1_CLK(CKCUClock)  = 1;  //开启时钟
    CKCU_PeripClockConfig(CKCUClock, ENABLE);

    AFIO_GPxConfig(USART_GPIO_GROUP, USART_TX_PIN, AFIO_FUN_USART_UART);
    AFIO_GPxConfig(USART_GPIO_GROUP, USART_RX_PIN, AFIO_FUN_USART_UART);

    /
    波特率: 115200
    长度:   8bits
    停止位: 1位
    校验位: 无
    模式:   正常模式
    /
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;
    USART_InitStructure.USART_StopBits = USART_STOPBITS_1;
    USART_InitStructure.USART_Parity = USART_PARITY_NO;
    USART_InitStructure.USART_Mode = USART_MODE_NORMAL;
    USART_Init(COM1_PORT, &USART_InitStructure);

    //中断设置   
    NVIC_EnableIRQ(COM1_IRQn);

    //使用中断方式接受数据
    USART_IntConfig(COM1_PORT, USART_INT_RXDR , ENABLE);

    // 使能 COM1_PORT  发送和接收
    USART_TxCmd(COM1_PORT, ENABLE);
    USART_RxCmd(COM1_PORT, ENABLE);
}

3、main函数#
#include "ht32.h"
#include "usart.h"

int main(void)
{
    USART_Configuration();//串口初始化
    while (1)
    {
        Usart_SendStr(COM1_PORT,"Hello World!\r\n");//循环发送字符串
        u16 t,len;
        if(USART_RX_STA&0x8000)
        {
            len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
            printf("\r\n您发送的消息为:\r\n");
            for(t=0;t<len;t++)
            {
                USART_SendData(COM1_PORT, USART_RX_BUF[t]);//向串口1发送数据
                while(USART_GetFlagStatus(COM1_PORT, USART_FLAG_TXDE)==RESET);//等待发送结束
            }
            printf("\r\n");
            USART_RX_STA=0;
        }
    }
}




使用特权

评论回复

相关帖子

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

本版积分规则

194

主题

6574

帖子

3

粉丝