本文使用串口1通信,实现了数据的收发。
主函数:
//串口发送/接收数据
#include "stm32f10x.h"
#include "yanshi.h"
#include "USART.h"
int main()
{
usart1_init();
// unsigned char wenben[] = {0x1, 0x43, 0x22, 0x65};
// usart1_init(72,9600); //串口初始化为9600
// USART1_Send_zifuchuan("123Hello你好!\r\n");
// USART1_Send(0xf1); //发送一个字节hex
//
// USART1_Send('A'); //发送对应的十六进制,或者文本模式下的a
// USART1_Send_shuzu(wenben, 4); //发送数组
//
// USART1_Send_zifuchuan("123Hello!\r\n");//\r\n转移字符来换行的 文本模式下的字符串
//
// USART1_Send_zifuchuan("你好,世界!\r\n");//\r\n转移字符来换行的 文本模式下的字符串
USART1_Send_zifuchuan("123Hello你好!\r\n");//\r\n转移字符来换行的 文本模式下的字符串
while(1)
{
// yanshi_ms (500);
//printf("1234wed你好,大学生\r\n");
}
}
头文件:
#ifndef __USART_H
#define __USART_H
#include "stm32f10x.h"
void usart1_init(void);
void USART1_Send(char ch); //发送字节
char USART1_Receive(void); //接收字节
void USART1_Send_shuzu(u8 *shuzu, u16 changdu); //发送数组
void USART1_Send_zifuchuan(char *zifuchuan); //发送字符串
//void usart1_init(void);
void usart1_init(unsigned int pl,unsigned int btl);//时钟频率 和波特率
//void USART1_Send(char ch); //发送字节
//char USART1_Receive(void); //接收字节
//
//void USART1_Send_shuzu(u8 *shuzu, u16 changdu); //发送数组
//void USART1_Send_zifuchuan(char *zifuchuan); //发送字符串
uint32_t Send_pow(uint32_t x, uint32_t y);
void USART1_Send_shuzi(uint32_t *shuzi, uint8_t changdu);
//int fputc(int ch, FILE *f); //printf重定向
#endif
串口部分的代码:
#include "stm32f10x.h"
#include "USART.h"
#include "stdio.h"
void usart1_init(void)
{
RCC -> APB2RSTR |= 1 << 14; //复位usart1
RCC->APB2RSTR &= ~(1 << 14); //停止复位
RCC->APB2ENR |= 1 << 2 | 1 << 14; //使能 GPIOA,usart1
GPIOA->CRH &= 0XFFFFF00F; //清零
GPIOA->CRH |= 0X000004B0; //tx pa9 复用推挽输出,rx pa10 浮空输入
USART1->CR1 = 0x202c;
//USART1->BRR = 0X27a; //设置波特率为115200
USART1->BRR = 0X1D4C; //设置波特率为9600
SCB -> AIRCR |= 0x06 << 8;
NVIC ->IP[37] |= 1 << 7 | 1 << 4; //设置抢占1,响应1
NVIC -> ISER[1] |= 1 << 5; //中断使能寄存器开启usart1的使能
}
void USART1_Send(char date) //发送
{
while((USART1->SR & 0X80) == 0); //TXE= 0等待发送数据缓冲寄存器为空, 1 & 1得1 取反 0 为假,出循环 有0得0
USART1 -> DR = date; //将待发送字符写入数据寄存器
}
char USART1_Receive(void) //接收
{
char ch = '\0'; //检查是否接收数据 0x20 10 0000 rxne 读数据寄存器非空 为0 没数据了
while((USART1->SR & 0X20) == 0); //等待接收数据缓冲寄存器非空 1 & 1得1 取反 0 为假,出循环 有0得0// while (!(USART1 -> SR & USART_SR_RXNE));
ch = (char)USART1 -> DR; //从数据寄存器中读取接收到的字符
return ch;
}
void USART1_Send_shuzu(uint8_t *shuzu, uint16_t changdu) //发送一个 数组,需要判断长度
{
uint16_t i;
for(i = 0; i < changdu; i ++)
{
USART1_Send(shuzu[i]);
}
}
void USART1_Send_zifuchuan(char *zifuchuan) //发送字符串,自带结束标志位,不需要判断长度
{
uint16_t i;
for(i = 0; zifuchuan[i] != 0; i ++)
{
USART1_Send(zifuchuan[i]);
}
}
void USART1_IRQHandler() //串口中断标志 中断现象:将接收到得数据再发送给电脑
{
if (USART1 -> SR & (1 << 5)) //如果读数据寄存器接收到了数据 进入循环
{
char data = USART1_Receive(); //数据来自串口接收端
USART1->SR &= ~(1 << 5); //清除接收非空标志位
USART1_Send(data); //进入中断,将数据再发送给电脑来验证
}
}
也算是一种 记录吧,加油!