PY32F003F18串口printf功能

news2024/11/30 15:36:36

1、PY32F003F18复用功能总结:

//GPIOx=GPIOA,Pin=GPIO_PIN_0,alternate=GPIO_AF9_USART2,则将PA0引脚复用为USART2_TX
//GPIOx=GPIOA,Pin=GPIO_PIN_0,alternate=GPIO_AF10_SPI1,则将PA0引脚复用为SPI1_MISO
//GPIOx=GPIOA,Pin=GPIO_PIN_1,alternate=GPIO_AF0_SPI1,则将PA1引脚复用为SPI1_SCK
//GPIOx=GPIOA,Pin=GPIO_PIN_1,alternate=GPIO_AF9_USART2,则将PA1引脚复用为USART2_RX
//GPIOx=GPIOA,Pin=GPIO_PIN_1,alternate=GPIO_AF10_SPI1,则将PA1引脚复用为SPI1_MOSI
//GPIOx=GPIOA,Pin=GPIO_PIN_2,alternate=GPIO_AF0_SPI1,则将PA2引脚复用为SPI1_MOSI
//GPIOx=GPIOA,Pin=GPIO_PIN_2,alternate=GPIO_AF1_USART1,则将PA2引脚复用为USART1_TX
//GPIOx=GPIOA,Pin=GPIO_PIN_2,alternate=GPIO_AF4_USART2,则将PA2引脚复用为USART2_TX
//GPIOx=GPIOA,Pin=GPIO_PIN_2,alternate=GPIO_AF10_SPI1,则将PA2引脚复用为SPI1_SCK
//GPIOx=GPIOA,Pin=GPIO_PIN_2,alternate=GPIO_AF12_I2C,则将PA2引脚复用为I2C_SDA
//GPIOx=GPIOA,Pin=GPIO_PIN_3,alternate=GPIO_AF1_USART1,则将PA3引脚复用为USART1_RX
//GPIOx=GPIOA,Pin=GPIO_PIN_3,alternate=GPIO_AF4_USART2,则将PA3引脚复用为USART2_RX
//GPIOx=GPIOA,Pin=GPIO_PIN_3,alternate=GPIO_AF10_SPI1,则将PA3引脚复用为SPI1_MOSI
//GPIOx=GPIOA,Pin=GPIO_PIN_3,alternate=GPIO_AF12_I2C,则将PA3引脚复用为I2C_SCL
//GPIOx=GPIOA,Pin=GPIO_PIN_4,alternate=GPIO_AF9_USART2,则将PA4引脚复用为USART2_TX
//GPIOx=GPIOA,Pin=GPIO_PIN_5,alternate=GPIO_AF0_SPI1,则将PA5引脚复用为SPI1_SCK
//GPIOx=GPIOA,Pin=GPIO_PIN_5,alternate=GPIO_AF9_USART2,则将PA5引脚复用为USART2_RX
//GPIOx=GPIOA,Pin=GPIO_PIN_6,alternate=GPIO_AF0_SPI1,则将PA6引脚复用为SPI1_MISO
//GPIOx=GPIOA,Pin=GPIO_PIN_6,alternate=GPIO_AF15_RTCOUT,则将PA6引脚复用为RTC_OUT
//GPIOx=GPIOA,Pin=GPIO_PIN_7,alternate=GPIO_AF0_SPI1,则将PA7引脚复用为SPI1_MOSI
//GPIOx=GPIOA,Pin=GPIO_PIN_7,alternate=GPIO_AF8_USART1,则将PA7引脚复用为USART1_TX
//GPIOx=GPIOA,Pin=GPIO_PIN_7,alternate=GPIO_AF9_USART2,则将PA7引脚复用为USART2_TX
//GPIOx=GPIOA,Pin=GPIO_PIN_7,alternate=GPIO_AF10_SPI1,则将PA7引脚复用为SPI1_MISO
//GPIOx=GPIOA,Pin=GPIO_PIN_7,alternate=GPIO_AF12_I2C,则将PA7引脚复用为I2C_SDA
//GPIOx=GPIOA,Pin=GPIO_PIN_12,alternate=GPIO_AF0_SPI1,则将PA12引脚复用为SPI1_MOSI
//GPIOx=GPIOA,Pin=GPIO_PIN_12,alternate=GPIO_AF6_I2C,则将PA12引脚复用为I2C_SDA
//GPIOx=GPIOA,Pin=GPIO_PIN_13,alternate=GPIO_AF0_SWJ,则将PA13引脚复用为SWDIO
//GPIOx=GPIOA,Pin=GPIO_PIN_13,alternate=GPIO_AF8_USART1,则将PA13引脚复用为USART1_RX,通常不要占用SWDIO
//GPIOx=GPIOA,Pin=GPIO_PIN_13,alternate=GPIO_AF10_SPI1,则将PA13引脚复用为SPI1_MISO,通常不要占用SWDIO
//GPIOx=GPIOA,Pin=GPIO_PIN_14,alternate=GPIO_AF0_SWJ,则将PA14引脚复用为SWCLK
//GPIOx=GPIOA,Pin=GPIO_PIN_14,alternate=GPIO_AF1_USART1,则将PA14引脚复用为USART1_TX,通常不要占用SWCLK
//GPIOx=GPIOA,Pin=GPIO_PIN_14,alternate=GPIO_AF4_USART2,则将PA14引脚复用为USART2_TX,通常不要占用SWCLK
//GPIOx=GPIOB,Pin=GPIO_PIN_5,alternate=GPIO_AF0_SPI1,则将PB5引脚复用为SPI1_MOSI
//GPIOx=GPIOB,Pin=GPIO_PIN_6,alternate=GPIO_AF0_USART1,则将PB6引脚复用为USART1_TX
//GPIOx=GPIOB,Pin=GPIO_PIN_6,alternate=GPIO_AF4_USART2,则将PB6引脚复用为USART2_TX
//GPIOx=GPIOB,Pin=GPIO_PIN_6,alternate=GPIO_AF6_I2C,则将PB6引脚复用为I2C_SCL
//GPIOx=GPIOB,Pin=GPIO_PIN_7,alternate=GPIO_AF0_USART1,则将PB7引脚复用为USART1_RX
//GPIOx=GPIOB,Pin=GPIO_PIN_7,alternate=GPIO_AF4_USART2,则将PB7引脚复用为USART2_RX
//GPIOx=GPIOB,Pin=GPIO_PIN_7,alternate=GPIO_AF6_I2C,则将PB7引脚复用为I2C_SDA

2、PY32F003F18重定义fputc函数

//重定义fputc函数
//函数功能:发送ch的值给USART2串口

int fputc(int ch, FILE *f)
{
    uint32_t isrflags;

    USART2->DR = (uint8_t)(ch & 0xFFU);
    //将ch写入串口数据寄存器(USART_DR),Send a byte to USART
  while(1)
    {
        isrflags = READ_REG(USART2->SR);//读"串口状态寄存器(USART_SR)"
        if((isrflags & USART_SR_TXE) != RESET)//如果TXE=1,即串口发送完成
            break;
    }
  return (ch);
}

3、测试程序

#include "USART2.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()

//PA0 ------> USART2_TX
//PA1 ------> USART2_RX

void USART2_GPIO_Config(void);
void USART2_NVIC_Cpnfig(void);
void USART2_Mode_Config(uint32_t baudrate);
void USART2_Init(uint32_t baudrate);
void USART2_Load_Send_Data(void);

//函数功能:USART2的IO口配置,PA0是为USART2_TX,PA1是USART2_RX
void USART2_GPIO_Config(void) 
{
  GPIO_InitTypeDef  GPIO_InitStructureure;

  __HAL_RCC_USART2_CLK_ENABLE();//使能USART2外设时钟
  __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟

  GPIO_InitStructureure.Pin = GPIO_PIN_0;     //选择第0脚,PA0是为USART2_TX
  GPIO_InitStructureure.Mode = GPIO_MODE_AF_PP;            //复用功能推挽模式
  GPIO_InitStructureure.Pull = GPIO_PULLUP;                //引脚上拉被激活
  GPIO_InitStructureure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //引脚速度为最高速
  GPIO_InitStructureure.Alternate = GPIO_AF9_USART2;       //将引脚复用为USART2
  HAL_GPIO_Init(GPIOA, &GPIO_InitStructureure);
	//根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器
	//将PA0初始化为USART2_TX

  GPIO_InitStructureure.Pin = GPIO_PIN_1;     //选择第1脚,PA1是USART2_RX
  GPIO_InitStructureure.Mode = GPIO_MODE_AF_PP;            //复用功能推挽模式
  GPIO_InitStructureure.Pull = GPIO_PULLUP;                //引脚上拉被激活
  GPIO_InitStructureure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //引脚速度为最高速
  GPIO_InitStructureure.Alternate = GPIO_AF9_USART2;       //将引脚复用为USART2
  HAL_GPIO_Init(GPIOA, &GPIO_InitStructureure);
	//根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器
	//将PA1初始化为USART2_RX
}

//函数功能:设置串口2中断优先级为0x01
void USART2_NVIC_Cpnfig(void)
{
  HAL_NVIC_SetPriority(USART2_IRQn, 0x01, 0);
	//设置串口2中断优先级为0x01,0无意义.USART2_IRQn表示中断源为串口2
}

//函数功能:波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口
void USART2_Mode_Config(uint32_t baudrate)
{
	UART_HandleTypeDef UART_HandleStructureure;
	HAL_StatusTypeDef retData;

  __HAL_RCC_USART2_CLK_ENABLE();//使能USART2外设时钟

  UART_HandleStructureure.Instance          = USART2;              //接口为USART2
  UART_HandleStructureure.Init.BaudRate     = baudrate;            //波特率为115200bps
  UART_HandleStructureure.Init.WordLength   = UART_WORDLENGTH_8B;  //串口字长度为8
  UART_HandleStructureure.Init.StopBits     = UART_STOPBITS_1;     //串口停止位为1位
  UART_HandleStructureure.Init.Parity       = UART_PARITY_NONE;    //串口无需奇偶校验
  UART_HandleStructureure.Init.HwFlowCtl    = UART_HWCONTROL_NONE; //串口无硬件流程控制
  UART_HandleStructureure.Init.Mode         = UART_MODE_TX_RX;     //串口工作模式为发送和接收模式
	retData=HAL_UART_Init(&UART_HandleStructureure);
	//根据UART_HandleStructureure型结构初始化USART2
  if ( retData!= HAL_OK)//串口初始化失败
  {
  }
//	__HAL_UART_ENABLE_IT(&UART_HandleStructureure, UART_IT_PE);
//	//串口接收数据时,使能奇偶校验错误时产生中断,Enable the UART Parity Error Interrup

//	__HAL_UART_ENABLE_IT(&UART_HandleStructureure, UART_IT_ERR);
//	//串口接收数据时,使能帧错误、噪音错误和溢出错误时产生中断
//	//Enable the UART Error Interrupt: (Frame error, noise error, overrun error)

	__HAL_UART_ENABLE_IT(&UART_HandleStructureure, UART_IT_RXNE);
	开启串口接收中断
	//串口接收数据时,使能"接收数据寄存器不为空"则产生中断(位RXNE=1)
	//Enable the UART Data Register not empty Interrupt

/在串口中断服务函数中发送数据配置开始//
//	__HAL_UART_ENABLE_IT(&UART_HandleStructureure, UART_IT_TXE);
	//串口发丝数据时,使能"串口发送数据寄存器为空"产生中断(位TXE=1)
	//Enable the UART Transmit data register empty Interrupt
	__HAL_UART_DISABLE_IT(&UART_HandleStructureure,UART_IT_TXE);
	//串口发丝数据时,不使能"串口发送数据寄存器为空"产生中断(位TXE=0)
	//Disable the UART Transmit Complete Interrupt

//  __HAL_UART_ENABLE_IT(&UART_HandleStructureure,UART_IT_TC);
	//串口发丝数据时,使能"串口发送完成"产生中断(位TC=1)
	//Enable the UART Transmit Complete Interrupt
	__HAL_UART_DISABLE_IT(&UART_HandleStructureure,UART_IT_TC);
	//串口发丝数据时,不使能"串口发送完成"产生中断(位TC=1)
/在串口中断服务函数中发送数据配置结束//

  HAL_NVIC_EnableIRQ(USART2_IRQn);
	//使能串口2中断
	//USART2_IRQn表示中断源为串口2
}

//函数功能:
//PA0是为USART2_TX,PA1是USART2_RX
//中断优先级为0x01
//波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口
void USART2_Init(uint32_t baudrate)
{
	USART2_GPIO_Config();//USART2的IO口配置,PA0是为USART2_TX,PA1是USART2_RX
	USART2_NVIC_Cpnfig();//设置串口2中断优先级为0x01
	USART2_Mode_Config(baudrate);
	//波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口
}

//重定义fputc函数
//函数功能:发送ch的值给USART2串口
int fputc(int ch, FILE *f)
{
	uint32_t isrflags;

	USART2->DR = (uint8_t)(ch & 0xFFU);
	//将ch写入串口数据寄存器(USART_DR),Send a byte to USART
  while(1)
	{
		isrflags = READ_REG(USART2->SR);//读"串口状态寄存器(USART_SR)"
		if((isrflags & USART_SR_TXE) != RESET)//等待TXE=1,即等待发送完成
			break;
	}
  return (ch);
}

//函数功能:串口2中断服务程序
void USART2_IRQHandler(void)
{
	uint8_t RX_temp;
  uint32_t isrflags;

	(void)RX_temp;//防止RX_temp不使用而产生警告

  isrflags   = READ_REG(USART2->SR);
	//读"串口状态寄存器(USART_SR)"

	if( (isrflags & USART_SR_RXNE) != RESET )//接收到新数据
	{//在串口状态寄存器中,发现RXNE=1,且串口控制寄存器1允许接收数据
		RX_temp = (uint8_t)(USART2->DR & (uint8_t)0x00FF);//读串口数据

		//软件先读"串口状态寄存器(USART_SR)",然后再读"串口数据寄存器USART_DR",就可以将ORE位(Overrun错误标志)清零;
		//软件先读"串口状态寄存器(USART_SR)",然后再读"串口数据寄存器USART_DR",就可以将NE位(噪声错误标志)清零;
		//软件先读"串口状态寄存器(USART_SR)",然后再读"串口数据寄存器USART_DR",就可以将FE位(帧错误标志)清零;
		//软件先读"串口状态寄存器(USART_SR)",然后再读"串口数据寄存器USART_DR",就可以将PE位(奇偶校验值错误)清零;
		//软件读"串口数据寄存器USART_DR",就可以将RXNE位清零
  }
	if( (isrflags & USART_SR_TXE) != RESET )//串口发送数据寄存器为空,Transmit Data Register empty interrupt
	{
		CLEAR_BIT(USART2->CR1, UART_IT_TXE);
		//将"串口控制寄存器1(USART_CR1)中的TXEIE位"设置为0
	  //串口发丝数据时,不使能"串口发送数据寄存器为空"产生中断(位TXEIE=0)
	  //Disable the UART Transmit Complete Interrupt

		SET_BIT(USART2->CR1, UART_IT_TC);
		//将"串口控制寄存器1(USART_CR1)中的TCIE位"设置为1
		//串口发丝数据时,使能"串口发送完成"产生中断(位TCIE=1)
		//Enable the UART Transmit Complete Interrupt	
	}
	if( (isrflags & UART_IT_TC) != RESET )//Transmission complete interrupt
	{
		CLEAR_BIT(USART2->CR1, UART_IT_TC);
		//将"串口控制寄存器1(USART_CR1)中的TCIE位"设置为0
		//串口发丝数据时,不使能"串口发送完成"产生中断(位TCIE=0)
		//Disable the UART Transmit Complete Interrupt

		SET_BIT(USART2->CR1, UART_IT_TXE);
		//将"串口控制寄存器1(USART_CR1)中的TXEIE位"设置为1
	  //串口发丝数据时,使能"串口发送数据寄存器为空"产生中断(位TXEIE=1)
	  //Enable the UART Transmit Complete Interrupt
	}
}

 直接用寄存器干了,看上去有点象寄存器工程,因为HALL库的确写的不太友好。不清楚原因。

#include "py32f0xx_hal.h"
#include "SystemClock.h"
#include "USART2.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "delay.h"
#include "LED.h"

const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
int main(void)
{
//	HSE_Config();
	//初始化"HSI,HSE,LSI振荡器",HSE用作系统时钟(SYSCLK),同时配置"AHB时钟(HCLK)和APB时钟(PCLK)"

  delay_init();
	HAL_Delay(1000);

	USART2_Init(115200);
//PA0是为USART2_TX,PA1是USART2_RX
//中断优先级为0x01
//波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口
	printf("%s",CPU_Reset_REG);
	MCU_LED_Init();

  while (1)
  {
		MCU_LED_Toggle();
		delay_ms(500);
		printf("\r\n9876543210\r\n");
  }
}

4、测试结果 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/986523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

容器编排学习(六)服务管理与用户权限管理

一 service管理 1 概述 容器化带来的问题 自动调度:在 Pod 创建之前,用户无法预知 Pod 所在的节点,以及 Pod的IP 地址一个已经存在的 Pod 在运行过程中,如果出现故障,Pod也会在新的节点使用新的IP 进行部署应用程…

安达发APS|APS智能排程软件的核心优势

APS软件是一种实时、具有约束能力的排产计划软件,能够对所有资源进行同步优化。它能够模拟生产中的物料、机器设备、人员、供应、客户需求、运输等影响计划的因素,不论是长期的或短期的计划,都具有优化、对比和可执行性。 APS软件采用基于内…

蓝桥杯官网填空题(土地测量)

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 造成高房价的原因有许多,比如土地出让价格。既然地价高,土地的面积必须仔细计算。遗憾的是,有些地块的形状不规则,比…

echarts条形图实现颜色渐变

eCharts——柱状图中的柱体颜色渐变_echarts 柱状图渐变_小美同学的博客-CSDN博客 【Echarts】柱状图渐变两种实现方式_echarts柱状图渐变_芳草萋萋鹦鹉洲哦的博客-CSDN博客

C++中的stack和queue

文章目录 1. stack的介绍和使用1.1 stack的介绍1.2 stack的使用 2. queue的介绍和使用2.1 queue的介绍2.2 queue的使用 3 priority_queue的介绍和使用3.1 priority_queue的介绍3.2 priority_queue的使用 4. 容器适配器4.1 什么是适配器4.2 STL标准库中stack和queue的底层结构4.…

Vue3学习(仅为了记录,参考意义不大)

一.Vue3介绍 1.Vue3的优势 2.使用create-vue创建vue3项目 vue-cli是创建vue2.0的脚手架工具,create-vue是创建vue3的脚手架工具,create-vue构建速度非常快 3.vue3项目目录和关键文件 二.Vue3组合式API 1.setup选项 setup语法糖: 总结…

fastjson漏洞批量检测工具

JsonExp 简介 版本:1.3.5 1. 根据现有payload,检测目标是否存在fastjson或jackson漏洞(工具仅用于检测漏洞)2. 若存在漏洞,可根据对应payload进行后渗透利用3. 若出现新的漏洞时,可将最新的payload新增至…

湖北初级(助理)、中级、高级(副高)工程类职称申报条件和业绩要求有哪些?

湖北初级、中级、副高职称申报学历条件和业绩要求是什么?有哪些要求?以下来自于官方解答: 副高职称学历要求: 中级职称学历要求: 助理(初级)职称学历要求: 现在评职称,主…

十七、MySQL约束演示

1、约束定义 (1)概念 约束,顾名思义,时作用域表中字段上的规则,用于限制存储在表中的数据,主要用于保证数据库中数据的正确、有效性和完整性。 (2)各种约束分类 1、非空约束(限制…

Win11透明任务栏失效怎么办

近期有小伙伴反映在更新Win11最新版本之后,发现透明任务栏失效了,这是怎么回事呢,遇到这种情况应该怎么解决呢,这里小编就给大家介绍几个Win11透明任务栏失效的解决方法,有需要的小伙伴快来看一看吧。 软件资源&#…

【全网严谨版】L1-016 查验身份证 (C++解法 整理分析了多种方法)

问题描述 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2&#…

二、创建个人首页页面

简介 改造 App.vue 创建一个展示页面,实现一个可以轮播的功能效果。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件:style.css、App.vue、assets 一、 自定义全局样式 将 style.css 中的文件样式内容替换为如下代码 /* 初始化样式 --------------------------…

《Java程序设计》实验报告

实验内容:面向对象程序设计 1、定一个名为Person的类,其中含有一个String类型的成员变量name和一个int类型的成员变量age, 分别为这两个变量定义访问方法和修改方法,另外再为该类定义一个名为speak的方法, 在其中输出n…

图书出版如何做好软文营销

在信息技术快速发展的时代,大部分人的阅读方式也从传统的纸媒演变为电子书阅读,在这种形势下,图书出版行业的经营模式、经营理念都面临着许多变革,那么在网络时代,图书出版行业应该如何做好软文营销呢?下面…

高频微观结构:日内及隔夜动量因子

本周天软因子序列课程暂时结束,感谢大家百忙之中参会交流! 本次会议主要内容有: 1.介绍日内及隔夜动量因子的构造逻辑,如何选择市 场代理变量对动量因子进行改进; 2.结合因子研究平台分别分析动量因子、日内涨幅因 子、隔夜涨幅因…

【力扣每日一题】2023.9.7 修车的最少时间

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个数值,数组里每个元素表示一个老师傅,老师傅修车花费的时间等于数值乘上车辆数的平方。 问我们修理…

【Docker】镜像的创建、管理与发布

镜像的获取 镜像可以从以下方式获得: 从远程镜像仓库拉取,可以是公有仓库,也可以是私有仓库从Dockerfile构建从文件导入(离线)从容器提交 镜像的基本操作 跟镜像相关的命令如下: $ docker image --help…

linux 文件属性相关

文章目录 文件存储介绍文件颜色含义软链接和硬链接 文件目录操作压缩解压 tar目录切换 cd创建目录 mkdir删除目录 rmdir rm复制文件或目录 cp移动文件或目录 mv查看指定目录下的内容 ls文本查看 cat more tail文本编辑 vim 查找查找文件 find查找文本 grep查找文件 whereis Lin…

语义分割实践思考记录(个人备忘录)

一、任务管理器、NVDIA的GPU利用率显示[1][2] 若需要在任务管理器中查看基于Pytorch框架的GPU利用率,那么,我们需要将监控面板监测内容调整为cuda。图一(左)即为英伟达命令行工具面板。 图一 英伟达GPU使用率监控 二、基于混淆矩阵…

如何配置Header Editor

。什么是Header Editor 当我们通过网页自带inspect中的network找到返回的response之后,如果需要查看具体的response内容。Header Editor可以自动将response格式美化 。如何配置 1/ 首先需要通过chrome插件安装好Header Editor 2/ 点击网页右上角图标&#xff0c…