stm32---usart1与电脑通信

usart.h

#ifndef _USART_H_
#define _USART_H_
#include "stm32f10x.h"
#include <stdio.h>
//发送一个字节

void GPIO1_Configuration(void);



void USART1_Configuration(unsigned long baund);

int fputc(int ch, FILE *f);


#endif

usart.c

#include "usart.h"
#include "string.h"


//重定义fputc();
//printf("hello world");


int fputc(int ch, FILE *f)
{
          
   
  USART_SendData(USART1, (uint8_t) ch); 
  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
  return (ch);
}


void USART1_Configuration(unsigned long baund)
{
          
   
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //打开APB2总线上的USART1和GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
//设置USART1的Tx引脚(PA.9)为第二功能推挽输出,最大翻转频率为50MHz
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
 
GPIO_Init(GPIOA,&GPIO_InitStructure);
//设置USART1的Rx引脚(PA.10)为浮空输入脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
 
 
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);    //打开APB2总线上的USART1和GPIOA时
USART_InitTypeDef USART_InitStructure;       //定义USART初始化结构体USART_InitStructure 
//波特率为115200bps;8位数据长度,1个停止位,无检验位;禁用硬件流控制;禁止USART时钟;时钟极性低;在第2个边沿捕获数据;最后一位数据的时钟脉冲不从SCLK输出
USART_InitStructure.USART_BaudRate=baund;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);


USART_Cmd(USART1,ENABLE);         //使能USART1

NVIC_InitTypeDef USART_NVIC;
	USART_NVIC.NVIC_IRQChannel=USART1_IRQn;
	USART_NVIC.NVIC_IRQChannelPreemptionPriority=0;
	USART_NVIC.NVIC_IRQChannelSubPriority=1;
	USART_NVIC.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&USART_NVIC);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	USART_Cmd(USART1,ENABLE);
}

void USART1_IRQHandler(void)
{
          
   
	if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
	 {
          
   
		 printf("receive...
");
		 USART_ClearITPendingBit(USART1,USART_IT_RXNE); 
	 }
}

main.c

#include "usart.h"

void delay_ms(uint32_t ms)
{
          
   
	uint32_t i_cnt,j_cnt;
	for(i_cnt=0;i_cnt<3000;i_cnt++);
	for(j_cnt=0;j_cnt<ms;j_cnt++);
	
}

int main(void)
{
          
   	
  USART1_Configuration(115200);
	printf("hello world
");
}
经验分享 程序员 微信小程序 职场和发展