stm32串口c语言程序,STM32串口通信-代码实现
代码实现
功能实现:与上位机进行通信
宏定义需要的GPIO
//头文件中的引脚 宏定义
// 串口1-USART1
#ifndef _USART_H
#define _USART_H
#include "stm32f10x.h"
#include "stdio.h"
// 串口1-USART1
#define USART1_TX USART1
#define USART1_TX_CLK RCC_APB2Periph_USART1
#define USART1_TX_APBxClkCmd RCC_APB2PeriphClockCmd
#define USART1_TX_BAUDRATE 115200
// USART GPIO 引脚宏定义
#define USART1_GPIO_CLK (RCC_APB2Periph_GPIOA)
#define USART1_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
#define USART1_TX_GPIO_PORT GPIOA
#define USART1_TX_GPIO_PIN GPIO_Pin_9
#define USART1_RX_GPIO_PORT GPIOA
#define USART1_RX_GPIO_PIN GPIO_Pin_10
#define USART1_IRQ USART1_IRQn
#define USART1_IRQHandler USART1_IRQHandler
void USART_Config(void);
void Usart_SendByte(USART_TypeDef *TX, uint8_t data);
void Usart_Two_SendByte(USART_TypeDef *TX_usart, uint16_t data);
void Usart_SendArray(USART_TypeDef *TX_usart, uint8_t *array, uint8_t num);
void Usart_SendStr(USART_TypeDef *TX_usart, uint8_t *str);
#endif
串口初始化配置
//这里只在这个函数使用 可用static限制一下
//中断分组配置函数
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 配置USART为中断源 */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQ;
/* 抢断优先级*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* 使能中断 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/* 初始化配置NVIC */
NVIC_Init(&NVIC_InitStructure);
}
//串口初始化函数
void USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 打开串口GPIO的时钟
//DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
RCC_APB2PeriphClockCmd(USART1_GPIO_CLK, ENABLE);
// 打开串口外设的时钟
//DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
RCC_APB2PeriphClockCmd(USART1_TX_CLK, ENABLE);
//将USART TX的GPIO配置为推挽复用模式
GPIO_InitStructure.GPIO_Pin = USART1_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(USART1_TX_GPIO_PORT,&GPIO_InitStructure);
//将USART RX的GPIO配置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = USART1_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(USART1_RX_GPIO_PORT, &GPIO_InitStructure);
//配置串口的工作参数
//波特率
USART_InitStructure.USART_BaudRate = USART1_TX_BAUDRATE;
// 配置 针数据字长
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_TX, &USART_InitStructure);
// 串口中断优先级配置
NVIC_Configuration();
// 使能串口接收中断
USART_ITConfig(USART1_TX, USART_IT_RXNE, ENABLE);
// 使能串口
USART_Cmd(USART1_TX, ENABLE);
}
给上位机发送数据
提示:下面这些函数 都在usart.c中哦(⊙o⊙)
发送一个字节
void Usart_SendByte(USART_TypeDef *TX_usart, uint8_t data)
{
USART_SendData(TX_usart,data);
//检测串口发送的数据
//若没有数据来 就会一直等待
while(USART_GetFlagStatus(TX_usart,USART_FLAG_TXE) == RESET);
发送两个字节
void Usart_Two_SendByte(USART_TypeDef *TX_usart, uint16_t data)
{
uint8_t temp_h,temp_l;
temp_h = (data&0xff00) >> 8;
temp_l = data&0xff;
//发送高八位
USART_SendData(TX_usart,temp_h);
while(USART_GetFlagStatus(TX_usart,USART_FLAG_TXE) == RESET);
//发送低八位
USART_SendData(TX_usart,temp_l);
while(USART_GetFlagStatus(TX_usart,USART_FLAG_TXE) == RESET);
}
发送八位数组
void Usart_SendArray(USART_TypeDef *TX_usart, uint8_t *array, uint8_t num)
{
uint8_t i;
for(i=0; i
{
Usart_SendByte(TX_usart,array[i]);
}
while(USART_GetFlagStatus(TX_usart,USART_FLAG_TC) == RESET);
}
发送字符串
void Usart_SendStr(USART_TypeDef *TX_usart, uint8_t *str)
{
uint8_t i = 0;
do
{
Usart_SendByte(TX_usart,str[i]);
i++;
}while(str[i] != '\0');
while(USART_GetFlagStatus(TX_usart,USART_FLAG_TC) == RESET);
}
注意:要勾选keil中的 ues MicroLIB选项
重定向c库函数调用
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口 */
USART_SendData(USART1_TX, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(USART1_TX, USART_FLAG_TXE) == RESET);
return (ch);
}
//重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
/* 等待串口输入数据 */
while (USART_GetFlagStatus(USART1_TX, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(USART1_TX);
}
主程序测试
#include "stm32f10x.h"
#include "usart.h"
int main(void)
{
uint8_t array[] = {0x00,0x01,0x03,0x04,0x05};
//串口初始化
USART_Config();
//发送一个字节
Usart_SendByte(DEBUG_USARTx,100);
//发送两个字节
Usart_Two_SendByte(DEBUG_USARTx , 0xff00);
//发送一个八位字节
Usart_SendArray(DEBUG_USARTx,array,5);
//发送字符串
Usart_SendStr(USART1_TX,"陈一一哇龘\n");
printf("陈一一哇\n\n\n\n");
while(1)
{
}
}
stm32串口c语言程序,STM32串口通信-代码实现相关推荐
- hx711c语言程序,STM32写的HX711程序
查看: 35712|回复: 60 STM32写的HX711程序 当前离线积分 初级会员, 积分 73, 距离下一级还需 127 积分 积分金钱73 注册时间2014-8-20 在线时间0 小时 电梯直 ...
- 多路采集存储c语言程序,stm32多路巡回数据采集系统设计 含源程序
此次设计是利用stm32开发板设计的.数据采集系统是模拟域与数字域之间必不可少的纽带,它的存在具有着非常重要的作用.本文介绍的重点是数据采集系统,而该系统硬件部分的重心在于单片机芯片.数据采集与通信控 ...
- 串口同步异步c语言程序,同步串口spi的c语言编程
原标题:同步串口spi的c语言编程 #include #include #define uchar unsigned char #define uint unsigned int uchar Tabl ...
- stm32流水灯c语言程序,STM32——流水灯程序
STM32--流水灯 stm32f10x_conf.h:打开stm32f10x_gpio.h和stm32f10x_rcc.h: stm32f10x_gpio.c 和 stm32f10x_rcc.c加入 ...
- stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果
实验的STM32型号: STM32F103C8T6 48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2 ...
- stm32流水灯c语言程序,stm32流水灯程序源码
#include "STM32f10x.h" #include #include "delay.h" /**************************** ...
- max6675 c语言程序,STM32+MAX6675利用SPI获取实时温度数据程序及代码
标签: 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 模拟spi之前写过 里面的部分代码摘取的正点原子的函数库:sys.uart.delay等文件 原理图 max6675.h ...
- c32循迹小车c语言程序,STM32小车红外黑线循迹源程序
/********************************* 深圳市航太电子 ******************************* * 实 验 名 :小车红外黑线循迹 * 实验说明 ...
- c32循迹小车c语言程序,stm32篇--小车循迹
小车的循迹算法 循迹小车使用红外对射寻黑线,根据轨道的不同,我使用了两种不同算法: (1)第一种是在轨道外有影响的,比如轨道外有黑色,车出去一点就会碰到黑色,那就是检测到歪了之后除非检测它 回来了,否 ...
- t12电烙铁c语言程序,可跑C代码的串口屏之T12白光烙铁
T12 白光烙铁也是电子DIY中一个非常经典的项目,以至于T12白光DIY烙铁也是广大爱好者和专业人员的标配工具:T12的整个电路可以说是一个标准的温控系统,因此把代码稍微改制,就可以实现各种温控器的 ...
最新文章
- 论坛报名 | 语音与自然语言处理的最新突破和前沿趋势
- php设计模式八-----装饰器模式
- 协程概念,原理(c++和node.js实现)
- R语言XML格式数据导入与处理
- 深度学习pytorch--多层感知机(三)
- project 2013 显示标题
- 进制转换c语言代码_奇怪的C语言代码,有些函数在变量前加上(void)是什么类型转换?...
- noi 3531 判断整除
- java同步方法必须是静态的吗_Java基础知识之synchronized同步方法、代码块、静态方法、静态代码块的区别...
- 数据库工作笔记002---Linux下开启,重启,关闭mysql
- 常用的MySQL命令大全
- 浅谈算法和数据结构: 四 快速排序
- for循环 批处理 查找文件 详细信息 文件名
- rssi参数获取_如何获取WlanGetNetworkBssList函数返回值的Rssi值
- 论文引用文献并插入编号
- 百家讲坛-郦波评说曾国藩家训
- 华为路由器 单臂路由
- 程序员陪女朋友自拍杆哪个好?自拍杆品牌推荐
- 网易云音乐linux安装路径,修复网易云音乐Linux版不能安装及运行的问题
- android源码下载(下)