2、星光STM32F03串口通信调试

串口通信调试

main.c

#include "main.h"



char data[100] ;
//数据缓冲流,用来存储数据

int main()
{
	
  System_Init();
  //系统初始化
	
  SysTick_Init(NULL);
  //必须有否则会出问题
	
  LED_Init();
  //LED灯初始化,用来观察实验现象
	
  USART1_Init();
  //串口1初始化
	
	while(1)
	{
		scanf("%s",data);
		//输入函数,可以输入数据到data数组中
		//这里的本质是计算机向32发送数据
		printf("输入的结果:%s",data);
		//输出函数,将数据打印出来
		//这里的本质是32向计算机发送数据
		USART1_receive();
		//串口1接收函数
		//本质是通过串口1  使32接收数据(这个函数使用有一些问题后面会提到)
	}
	

}

main.h
这里是各种头文件不再解释

#ifndef __MAIN_H_
#define __MAIN_H_

#include "stm32f1xx.h"
#include "stm32_types.h"
#include "stm32_system.h"
#include "delay.h"


//驱动头文件
#include "Systick.h"
#include "led.h"
#include "usart.h"

#endif

usart.h

#ifndef __USART_H_
#define __USART_H_

#include "stm32f1xx.h"
#include "stm32_types.h"
#include "stm32f1xx_hal.h"
#include "delay.h"

#include "stdio.h"
#include "stdlib.h"
#include <cstring>
//这三个头文件是为了使用printf  scanf  重定义和strlen函数

#define UART_LSR_RDR  (1<<5)    //接收完成标志
#define UART_LSR_THRE (1<<6)    //发送完成标志

#define SEND_BUF1 (USART1->DR)  //串口1发送缓冲区
#define RECV_BUF1 (USART1->DR)  //串口1接收缓冲区
#define USART1_SR (USART1->SR)  //串口1状态


#define SEND_BUF2 (USART2->DR)
#define RECV_BUF2 (USART2->DR)
#define USART2_SR (USART2->SR) //和一同理

void USART1_Init(void);
//串口1初始化
void USART1_receive(void);
//串口1接收数据  本质32接收计算机的信息
void USART1_send(char *data);
//串口1发送数据  本质32向计算机发送信息
#endif

usart.c

#include "usart.h"


UART_HandleTypeDef usart1;
//串口结构体句柄语句
u8 test_rxbuf1[200];
//接收缓冲流数组
u8 rx_index1;
//接收长度
void USART1_Init(void)//串口初始化
{
	GPIO_InitTypeDef GPIO_InitStruct;
	__GPIOA_CLK_ENABLE();      //使能GPIOA时钟
	__USART1_CLK_ENABLE();     //使能USART1时钟
	
	GPIO_InitStruct.Pin = GPIO_PIN_9; //UASRT1对应IO口PA9 TX
	GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;        //复用开漏输出模式
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  //高速
	GPIO_InitStruct.Pull = GPIO_PULLUP;            //上拉
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        //初始化PA9,PA10
	
	GPIO_InitStruct.Pin = GPIO_PIN_10; //UASRT1对应IO口PA10  RX
	GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;   //配置为输入
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        //初始化PA10  RX
	
	usart1.Instance          = USART1;                //串口1
	usart1.Init.BaudRate     = 115200;               //波特率设置
	usart1.Init.WordLength   = UART_WORDLENGTH_8B;    //8位
	usart1.Init.StopBits     = UART_STOPBITS_1;       //1个停止位
	usart1.Init.Parity       = UART_PARITY_NONE;      //无校验
	usart1.Init.HwFlowCtl    = UART_HWCONTROL_NONE;   //无硬件流
	usart1.Init.Mode         = UART_MODE_TX_RX;       //串口发送,接收使能
	usart1.Init.OverSampling = UART_OVERSAMPLING_16;  //16倍过采样  
	
	HAL_UART_Init(&usart1);   //初始化串口

    //__HAL_UART_ENABLE_IT(&usart1, UART_IT_RXNE);   //使能接收中断
	
   	//HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
   	//HAL_NVIC_EnableIRQ(USART1_IRQn);
   	//后面这三个语句重点说一下,当我们使用scanf重定义的时候这三个需要注释才能使用scanf语句,但是void USART1_IRQHandle(void)因为中断函数被注释所以不能使用。
   	//但当我们把注释取消的时候,scanf函数将出现问题。
	
}


void USART1_IRQHandler(void)
{
	unsigned long temp;
	
	temp = USART1_SR;
	
	if(temp&UART_LSR_RDR)
	{
		test_rxbuf1[rx_index1++] = RECV_BUF1;
	}
	
	HAL_UART_IRQHandler(&usart1);
}

void USART1_send(char *data)
{
	uint16_t i,j;
	i = strlen(data);
	
	for(j=0; j<i; j++)
	{
		while((USART1_SR&UART_LSR_THRE)==0);
		SEND_BUF1 = data[j];	
	}
	
}
	

void USART1_receive(void)
{
	while(rx_index1)
	{
		uint8_t i;
		printf("usart1串口接收到: ");
		for(i=0;i<rx_index1;i++)
		{
			printf("%c",test_rxbuf1[i]);
		}
		printf("\r\n");
		rx_index1 = 0;
	}
}



//printf函数重定义
int fputc(int ch, FILE *f)
{    	
	while((USART1_SR&UART_LSR_THRE)==0);	//当串口1发送完成且状态为1
	SEND_BUF1 = (u8) ch; //发送数据
	
	return ch;
}

//scanf函数重定义
int fgetc(FILE* f)
{

	while(!(USART1_SR&UART_LSR_RDR));//当不接受且状态为1的时候
	return RECV_BUF1;//返回数据
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值