stm325个串口的配置函数 STM32串口如何发送数据

5个串口的配置函数和收发数据函数代码:
#include “stm32f10x.h”
#include “misc.h”
#include “stm32f10x_gpio.h”
#include “stm32f10x_usart.h”
void usart1_configuration(void)
{
gpio_inittypedef gpio_initstructure;
usart_inittypedef usart_initstructure;
nvic_inittypedef nvic_initstructure;
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable );
rcc_apb2periphclockcmd(rcc_apb2periph_usart1, enable );
gpio_initstructure.gpio_pin = gpio_pin_9; //usart1 tx;
gpio_initstructure.gpio_mode = gpio_mode_af_pp; //复用推挽输出;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpioa, &gpio_initstructure); //端口a;
gpio_initstructure.gpio_pin = gpio_pin_10; //usart1 rx;
gpio_initstructure.gpio_mode = gpio_mode_in_floating; //浮空输入;
gpio_init(gpioa, &gpio_initstructure); //端口a;
usart_initstructure.usart_baudrate = 9600; //波特率;
usart_initstructure.usart_wordlength = usart_wordlength_8b; //数据位8位;
usart_initstructure.usart_stopbits = usart_stopbits_1; //停止位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);//配置串口参数;
nvic_prioritygroupconfig(nvic_prioritygroup_2); //设置中断组,4位抢占优先级,4位响应优先级;
nvic_initstructure.nvic_irqchannel = usart1_irqn; //中断号;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; //抢占优先级;
nvic_initstructure.nvic_irqchannelsubpriority = 0; //响应优先级;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
usart_itconfig(usart1, usart_it_rxne, enable);
usart_cmd(usart1, enable); //使能串口;
}
void usart1_send_byte(u8 data) //发送一个字节;
{
usart_senddata(usart1,data);
while( usart_getflagstatus(usart1, usart_flag_tc) == reset );
}
void usart1_send_string(u8 *data) //发送字符串;
{
while(*data)
usart1_send_byte(*data++);
}
void usart1_irqhandler(void) //中断处理函数;
{
u8 res;
if(usart_getitstatus(usart1, usart_it_rxne) == set) //判断是否发生中断;
{
usart_clearflag(usart1, usart_it_rxne); //清除标志位;
res=usart_receivedata(usart1); //接收数据;
usart1_send_byte(res); //用户自定义;
}
}
void usart2_configuration(void)
{
gpio_inittypedef gpio_initstructure;
usart_inittypedef usart_initstructure;
nvic_inittypedef nvic_initstructure;
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable );
rcc_apb1periphclockcmd(rcc_apb1periph_usart2, enable );
gpio_initstructure.gpio_pin = gpio_pin_2; //usart2 tx;
gpio_initstructure.gpio_mode = gpio_mode_af_pp; //复用推挽输出;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpioa, &gpio_initstructure); //端口a;
gpio_initstructure.gpio_pin = gpio_pin_3; //usart2 rx;
gpio_initstructure.gpio_mode = gpio_mode_in_floating; //浮空输入;
gpio_init(gpioa, &gpio_initstructure); //端口a;
usart_initstructure.usart_baudrate = 9600; //波特率;
usart_initstructure.usart_wordlength = usart_wordlength_8b; //数据位8位;
usart_initstructure.usart_stopbits = usart_stopbits_1; //停止位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(usart2, &usart_initstructure);//配置串口参数;
nvic_prioritygroupconfig(nvic_prioritygroup_2); //设置中断组,4位抢占优先级,4位响应优先级;
nvic_initstructure.nvic_irqchannel = usart2_irqn; //中断号;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; //抢占优先级;
nvic_initstructure.nvic_irqchannelsubpriority = 0; //响应优先级;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
usart_itconfig(usart2, usart_it_rxne, enable);
usart_cmd(usart2, enable); //使能串口;
}
void usart2_send_byte(u8 data) //发送一个字节;
{
usart_senddata(usart2,data);
while( usart_getflagstatus(usart2, usart_flag_tc) == reset );
}
void usart2_send_string(u8 *data) //发送字符串;
{
while(*data)
usart2_send_byte(*data++);
}
void usart2_irqhandler(void) //中断处理函数;
{
u8 res;
if(usart_getitstatus(usart2, usart_it_rxne) == set) //判断是否发生中断;
{
usart_clearflag(usart2, usart_it_rxne); //清除标志位;
res=usart_receivedata(usart2); //接收数据;
usart2_send_byte(res); //用户自定义;
}
}
void usart3_configuration(void)
{
gpio_inittypedef gpio_initstructure;
usart_inittypedef usart_initstructure;
nvic_inittypedef nvic_initstructure;
rcc_apb2periphclockcmd(rcc_apb2periph_gpiob, enable );
rcc_apb1periphclockcmd(rcc_apb1periph_usart3, enable );
gpio_initstructure.gpio_pin = gpio_pin_10; //usart3 tx;
gpio_initstructure.gpio_mode = gpio_mode_af_pp; //复用推挽输出;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpiob, &gpio_initstructure); //端口b;
gpio_initstructure.gpio_pin = gpio_pin_11; //usart3 rx;
gpio_initstructure.gpio_mode = gpio_mode_in_floating; //浮空输入;
gpio_init(gpiob, &gpio_initstructure); //端口b;
usart_initstructure.usart_baudrate = 9600; //波特率;
usart_initstructure.usart_wordlength = usart_wordlength_8b; //数据位8位;
usart_initstructure.usart_stopbits = usart_stopbits_1; //停止位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(usart3, &usart_initstructure);//配置串口参数;
nvic_prioritygroupconfig(nvic_prioritygroup_2); //设置中断组,4位抢占优先级,4位响应优先级;
nvic_initstructure.nvic_irqchannel = usart3_irqn; //中断号;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; //抢占优先级;
nvic_initstructure.nvic_irqchannelsubpriority = 0; //响应优先级;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
usart_itconfig(usart3, usart_it_rxne, enable);
usart_cmd(usart3, enable); //使能串口;
}
void usart3_send_byte(u8 data) //发送一个字节;
{
usart_senddata(usart3,data);
while( usart_getflagstatus(usart3, usart_flag_tc) == reset );
}
void usart3_send_string(u8 *data) //发送字符串;
{
while(*data)
usart3_send_byte(*data++);
}
void usart3_irqhandler(void) //中断处理函数;
{
u8 res;
if(usart_getitstatus(usart3, usart_it_rxne) == set) //判断是否发生中断;
{
usart_clearflag(usart3, usart_it_rxne); //清除标志位;
res=usart_receivedata(usart3); //接收数据;
usart3_send_byte(res); //用户自定义;
}
}
void uart4_configuration(void)
{
gpio_inittypedef gpio_initstructure;
usart_inittypedef usart_initstructure;
nvic_inittypedef nvic_initstructure;
rcc_apb2periphclockcmd(rcc_apb2periph_gpioc, enable );
rcc_apb1periphclockcmd(rcc_apb1periph_uart4, enable );
gpio_initstructure.gpio_pin = gpio_pin_10; //uart4 tx;
gpio_initstructure.gpio_mode = gpio_mode_af_pp; //复用推挽输出;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpioc, &gpio_initstructure); //端口c;
gpio_initstructure.gpio_pin = gpio_pin_11; //uart4 rx;
gpio_initstructure.gpio_mode = gpio_mode_in_floating; //浮空输入;
gpio_init(gpioc, &gpio_initstructure); //端口c;
usart_initstructure.usart_baudrate = 9600; //波特率;
usart_initstructure.usart_wordlength = usart_wordlength_8b; //数据位8位;
usart_initstructure.usart_stopbits = usart_stopbits_1; //停止位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(uart4, &usart_initstructure);//配置串口参数;
nvic_prioritygroupconfig(nvic_prioritygroup_2); //设置中断组,4位抢占优先级,4位响应优先级;
nvic_initstructure.nvic_irqchannel = uart4_irqn; //中断号;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; //抢占优先级;
nvic_initstructure.nvic_irqchannelsubpriority = 0; //响应优先级;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
usart_itconfig(uart4, usart_it_rxne, enable);
usart_cmd(uart4, enable); //使能串口;
}
void uart4_send_byte(u8 data) //发送一个字节;
{
usart_senddata(uart4,data);
while( usart_getflagstatus(uart4, usart_flag_tc) == reset );
}
void uart4_send_string(u8 *data) //发送字符串;
{
while(*data)
uart4_send_byte(*data++);
}
void uart4_irqhandler(void) //中断处理函数;
{
u8 res;
if(usart_getitstatus(uart4, usart_it_rxne) == set) //判断是否发生中断;
{
usart_clearflag(uart4, usart_it_rxne); //清除标志位;
res=usart_receivedata(uart4); //接收数据;
uart4_send_byte(res); //用户自定义;
}
}
void uart5_configuration(void)
{
gpio_inittypedef gpio_initstructure;
usart_inittypedef usart_initstructure;
nvic_inittypedef nvic_initstructure;
rcc_apb2periphclockcmd(rcc_apb2periph_gpioc|rcc_apb2periph_gpiod, enable );
rcc_apb1periphclockcmd(rcc_apb1periph_uart5, enable );
gpio_initstructure.gpio_pin = gpio_pin_12; //uart5 tx;
gpio_initstructure.gpio_mode = gpio_mode_af_pp; //复用推挽输出;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpioc, &gpio_initstructure); //端口c;
gpio_initstructure.gpio_pin = gpio_pin_2; //uart5 rx;
gpio_initstructure.gpio_mode = gpio_mode_in_floating; //浮空输入;
gpio_init(gpiod, &gpio_initstructure); //端口d;
usart_initstructure.usart_baudrate = 9600; //波特率;
usart_initstructure.usart_wordlength = usart_wordlength_8b; //数据位8位;
usart_initstructure.usart_stopbits = usart_stopbits_1; //停止位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(uart5, &usart_initstructure);//配置串口参数;
nvic_prioritygroupconfig(nvic_prioritygroup_2); //设置中断组,4位抢占优先级,4位响应优先级;
nvic_initstructure.nvic_irqchannel = uart5_irqn; //中断号;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; //抢占优先级;
nvic_initstructure.nvic_irqchannelsubpriority = 0; //响应优先级;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
usart_itconfig(uart5, usart_it_rxne, enable);
usart_cmd(uart5, enable); //使能串口;
}
void uart5_send_byte(u8 data) //发送一个字节;
{
usart_senddata(uart5,data);
while( usart_getflagstatus(uart5, usart_flag_tc) == reset );
}
void uart5_send_string(u8 *data) //发送字符串;
{
while(*data)
uart5_send_byte(*data++);
}
void uart5_irqhandler(void) //中断处理函数;
{
u8 res;
if(usart_getitstatus(uart5, usart_it_rxne) == set) //判断是否发生中断;
{
usart_clearflag(uart5, usart_it_rxne); //清除标志位;
res=usart_receivedata(uart5); //接收数据;
uart5_send_byte(res); //用户自定义;
}
stm32串口发送数据
1. 串口发送数据最直接的方式就是标准调用库函数 。
void send_data(u8 *s)
{
while(*s!=‘\0’)
{
while(usart_getflagstatus(usart1,usart_flag_tc )==reset);
usart_senddata(usart1,*s);
s++;
}
}
2. 直接使用printf函数。
整合自:csdnsumjess、可以吃的鱼


一文了解操作系统的内存管理算法
(TOSHIBA)东芝光耦:5pin DIP6(cut) 封装(包装)
马斯克表示将扩大其太阳能电池板业务 并希望能够实现本地生产以降低成本
荣耀v9怎么样?拍照与颜值集于一身的荣耀v9,包你满意
什么是OTA 在5G / NR中为何选择OTA?
stm325个串口的配置函数 STM32串口如何发送数据
MiR500自主移动机器人,投入到生产链物流
图腾柱TCM之两相变频错相的两种方法
台式万用表和数字万用表使用
如何改进CPU性能发展瓶颈问题?
苹果若是想要在今年发布一款5G手机华为可能是一种可行的选择
仅有233克,史上最轻的横向折叠旗舰!OPPO发布全新一代Find N2系列
浅析QSFP28 PSM4和QSFP28 CWDM4光模块
通用二极管1N4007的主要参数
黑科技!GPS时钟服务器在电力系统技术应用
IGBT管的功耗讲解
透射电镜TEM测试原理及过程
聚焦伺服系统差异化国产解决方案
数据库引擎是什么
光合强度测定仪产品特点介绍