gd32f303在IAR下的printf串口助手打印+串口收发配置

第一次用兆易创新32位arm,感觉同为国产,确实不如华大改动(创新)大,至少给人的感觉几乎照搬ST的,虽然两者开发可参考资料都少的可怜;
对于USARTx的驱动配置步骤:
https://blog.csdn.net/JackieCoo/article/details/126777665(可参考)
1、以USART0为例(查询方式)
使能GPIOA时钟;
使能USART0时钟;
使能复用功能AF时钟;
配置GPIOA的输出模式AF-PP,50MZ,PA9 TX;
配置GPIOA的输入模式IN-FLOATING,50MZ,PA10 RX;
复位USART0;
设置波特率115200;(主从机波特率一致)
数据格式8bit数据位、无奇偶校验、1bit停止+1bit起始;
使能发送器;
使能接收器;
使能USART0外设;
(采用中断方式可使能中断收发标志,参考GD32官方库,以上都可直接调用GD32官方库函数实现,不用手动底层驱动配置);
2、收发函数

void  usart_reveive(uint8_t *r_array,uint8_t length)
{
	uint8_t j = 0;
	while(j<length)
	{	
		while(RESET == usart_flag_get(USART0,USART_FLAG_RBNE));//这个接收标志是非空置1,就是当缓冲区不为空时,即有数据时要让CPU取走数据,即赋值给内存;当RBNE置1的时候跳出等待循环;
		r_array[j] = usart_data_receive(USART0);
		j++;
	}
}

void  usart_send(uint8_t *t_array,uint8_t length)
{
	uint8_t i = 0;
	while(i<length)
	{	
		usart_data_receive(USART0,USART_FLAG_TBE);
		while(RESET == usart_flag_get(USART0,USART_FLAG_TBE));//这个发送标志是空置1,就是当缓冲区为空时,即缓冲区无数据时要让CPU去放数据,当TBE置1的时候跳出等待循环;
		i++;
	}
}
uint8_t receive_trans[10];//串口助手发10个,再原值返回给它10个
int main()
{
	while(1)
	{
		//串口助手pc端与MCU的互动;
		usart_reveive(receive_trans,10);
		usart_send(receive_trans,10);
	}
}

3、当写完编译烧录成功以后,你会发现串口助手未必就能正常显示你收发的数据,可能乱码(前提是你串口号,波特率,数据格式这些常规选择正确,这个就不用说了),这时候关键就需要你去看看你板子硬件电路提供的晶振源了,看看systemClock的时钟源到底是多少,官库里有get_XX_Clock函数(每种ARM片子都有相应的函数);一般都是默认的晶振源是内部RC振荡器,有的会接外部晶振(具体看你硬件板子怎么设计的);这个时候如果选用外部晶振源,官库里关于外部晶振的宏定义一定要保持和实际外部晶振源(比如说外接了一个16M的)一致;
4、同样在IAR环境下使用printf要比keil好设置些,只需要调stdio.h函数,设置一下full,然后重定义fputc函数就行,如果出现乱码还是可能因为软件配置的时钟源的原因影响导致的;
5、关于中断方式的收发逻辑:
【注意】在连续接收的时候出现数据接收错位的原因?
TXE置1的条件:是将数据(10bit)完全从buffer缓冲区拿出到移位寄存器后;
RXNE置1的条件:是将数据(10bit)完全从移位寄存器移到buffer缓冲区后;
例如:发送trans[6]=0,1,2,3,4,5(发送帧);接收receive[6] = 0,1,2,3,4,5(接收帧);中间协议假设已给定会按照发送帧和接收帧的内容顺序通信;但是实际过程中有 while(rxcount < rx_size) 这句接收等待和没有这句语句的区别就是,当有等待的时候会在一次轮询当中(一拍当中)完全等到数组receive[6]把6个数据接收赋值完成,所以顺序不会错位;但是当没有等待的时候,RXNE是每隔一个很短时间才置1的,data寄存器被读出后,标志清0退出ISR,然后主函数会在这个间隔去执行自己,有可能接收端的下个数据在路上时(亦还没到移位寄存器将数据完全移入biffer缓冲区时),主函数已经执行下一拍到重新开始发送处了,这时候又开始进行发送中断了,所以上一拍就相当于成功接收了一个字节的数据,如果连续3拍因为硬件的问题都只来的及成功接收一个字节,那就会出现receive[6] = 0,0,0,0,1,2(接收帧)的现象(还需要注意计数值是全局变量);所以当没有 while(rxcount < rx_size) 这句接收等待时,就只能靠硬件传输的足够快和连续,能将receive[6]这个6个字节数据在usart_interrupt_enable(USART0, USART_INT_RBNE)和txcount = rxcount = 0;之间执行进6次接收中断执行完,这样赋值顺序才不会错位,按照接收receive[6] = 0,1,2,3,4,5(接收帧);

uint8_t tx_size = TRANSMIT_SIZE;
uint8_t rx_size = 32;
uint8_t txcount = 0; 
uint16_t rxcount = 0;   //注意计数值是全局变量
/* enable USART TBE interrupt */  
    usart_interrupt_enable(USART0, USART_INT_TBE);
    
    /* wait until USART send the transmitter_buffer */
    while(txcount < tx_size);
    
    while(RESET == usart_flag_get(USART0, USART_FLAG_TC));
    
    usart_interrupt_enable(USART0, USART_INT_RBNE);  //
    
    /* wait until USART receive the receiver_buffer */
    while(rxcount < rx_size);
    txcount = rxcount = 0;

/***********************************************************************/
void USART0_IRQHandler(void)
{
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
        /* receive data */
        rxbuffer[rxcount++] = usart_data_receive(USART0);
        if(rxcount == rx_size){
            usart_interrupt_disable(USART0, USART_INT_RBNE);
        }
    }
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)){
        /* transmit data */
        usart_data_transmit(USART0, txbuffer[txcount++]);
        if(txcount == tx_size){
            usart_interrupt_disable(USART0, USART_INT_TBE);
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: gd32f303开发资料.rar是一种包含有关gd32f303微控制器开发的压缩文件。gd32f303是一款由GigaDevice公司设计的低功耗微控制器系列,具有高性能和丰富的外设功能。 在这个开发资料的压缩文件中,我们可以找到许多与gd32f303相关的资源和信息。首先,它可能包含gd32f303的数据手册,其中详细介绍了微控制器的特性、功能和寄存器设置。这对开发者来说非常重要,因为它们可以帮助他们理解gd32f303微控制器的工作原理和编程接口。 此外,gd32f303开发资料.rar中可能还包含有关编程工具的文档,例如Keil、IAR或GCC等编译器的使用指南。这些文档可以告诉开发者如何设置开发环境、编译代码和调试程序。 此外,这个开发资料还可能包含一些示例代码和工程文件,以帮助开发者快速入门gd32f303的编程。这些示例代码是已经编写好的,开发者可以根据自己的需求进行修改。 最后,gd32f303开发资料.rar还可能包含一些关于周边外设和模块的资料,例如LCD显示屏、蓝牙模块、Wi-Fi模块等。这些资料对于开发与gd32f303微控制器相关的应用程序或项目非常重要,可以帮助开发者了解如何与这些外设进行交互和集成。 综上所述,gd32f303开发资料.rar是一个非常有用的资源,可以帮助开发者深入了解gd32f303微控制器的特性、编程接口和外设功能,从而加快他们的开发进度。 ### 回答2: "gd32f303开发资料.rar" 是一个文件压缩包,其中包含有关gd32f303芯片的开发资料。gd32f303芯片是一款由中国芯片制造商GigaDevice研发的微控制器。通过该开发资料,开发人员可以了解gd32f303芯片的架构、功能特性和技术规格。 在这个压缩包中,可能包含以下一些常见的开发资料: 1. 数据手册和参考手册:这些手册详细描述了gd32f303芯片的硬件规格、引脚定义、时钟配置、寄存器和位描述等。开发人员可以根据这些手册了解芯片的工作原理和使用方法。 2. 示例代码和工程文件:示例代码提供了一些基本的功能实现的范例,可以帮助开发人员快速上手进行开发。工程文件包含了示例代码的项目配置信息,可以直接导入开发环境进行编译和调试。 3. 开发工具链和驱动程序:这些工具和驱动程序用于支持gd32f303的开发。例如,编译器、调试器、下载器等工具;USB驱动、串口驱动等。 对于开发人员而言,借助这些开发资料,可以更好地理解gd32f303芯片并进行软件开发。他们可以根据手册了解芯片的功能,使用示例代码进行快速开发,使用工具链进行编译和调试。同时,开发人员也可以通过这些资料获得技术支持,例如在使用过程中遇到问题时,可以查阅手册或向厂商咨询。 总之,gd32f303开发资料.rar是提供给开发人员的一个综合性压缩包,其中包含了有关gd32f303芯片的重要开发资料。这些资料是开发人员在进行软件开发过程中必备的参考和工具。 ### 回答3: gd32f303开发资料.rar是一种压缩文件,其中包含了关于gd32f303微控制器的开发资料。gd32f303是一款由华大基础科技有限公司推出的微控制器芯片,它采用了32位RISC架构,并且集成了丰富的外设和功能模块,适用于各种应用领域。 在gd32f303开发资料.rar中可能包含以下内容: 1. 数据手册:详细描述了gd32f303芯片的主要规格和功能,在设计时可以参考该手册了解芯片的详细特性,包括引脚功能、时钟配置、外设特性等等。 2. 参考设计:提供了一些基于gd32f303芯片的原理图和PCB布局设计,可以作为参考设计来快速开发自己的项目。这些设计通常包含一些示例电路和外设的连接方式。 3. 硬件开发指南:指导如何进行gd32f303芯片的硬件设计和连接,包括引脚的选择和使用、电源设计、时钟配置等等。这些指南可以帮助硬件工程师更好地理解和应用gd32f303芯片。 4. 软件开发工具:可能会提供一些软件开发工具的安装包,例如编译器、调试器、仿真器等等。这些工具可以用于编写gd32f303芯片的软件程序,并进行调试和测试。 总之,gd32f303开发资料.rar包含了一系列用于帮助开发者进行gd32f303芯片的硬件设计和软件开发的资料和工具,可以提供开发时所需的参考和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUR0608

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值