serial.c
#include "serial.h"
int fputc(int ch,file *p) //在使用printf时系统自动条用此函数
{
usart_senddata(usart2,(u8)ch);
while(usart_getflagstatus(usart2,usart_flag_txe)==reset);
return ch;
}
/*******************************************************************************
* 函 数 名 : serial_init
* 函数功能 : io端口及串口1,时钟初始化函数 a9,a10
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial1_init(u32 bt)
{
gpio_inittypedef gpio_initstructure; //声明一个结构体变量,用来初始化gpio
nvic_inittypedef nvic_initstructure; //中断结构体定义
usart_inittypedef usart_initstructure; //串口结构体定义
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa|rcc_apb2periph_usart1|rcc_apb2periph_afio,enable);
gpio_initstructure.gpio_pin=gpio_pin_9;//tx
gpio_initstructure.gpio_speed=gpio_speed_50mhz;
gpio_initstructure.gpio_mode=gpio_mode_af_pp;
gpio_init(gpioa,&gpio_initstructure);
gpio_initstructure.gpio_pin=gpio_pin_10;//rx
gpio_initstructure.gpio_mode=gpio_mode_in_floating;
gpio_init(gpioa,&gpio_initstructure);
nvic_prioritygroupconfig(nvic_prioritygroup_1);
nvic_initstructure.nvic_irqchannel = usart1_irqn;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0;
nvic_initstructure.nvic_irqchannelsubpriority = 1;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
usart_initstructure.usart_baudrate=bt; //波特率设置为bt
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);
usart_itconfig(usart1, usart_it_rxne, enable);//使能或者失能指定的usart中断 接收中断
usart_clearflag(usart1,usart_flag_tc);//清除usartx的待处理标志位
}
/*******************************************************************************
* 函 数 名 : serial2_init
* 函数功能 : io端口及串口2,时钟初始化函数 a2,a3
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial2_init(u32 bt)
{
usart_inittypedef usart_initstructure;
nvic_inittypedef nvic_initstructure;
gpio_inittypedef gpio_initstructure; //声明一个结构体变量,用来初始化gpio
//使能串口的rcc时钟
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa , enable); //使能uart3所在gpiob的时钟
rcc_apb1periphclockcmd(rcc_apb1periph_usart2, enable);
//串口使用的gpio口配置
// configure usart2 rx (pb.11) as input floating
gpio_initstructure.gpio_pin = gpio_pin_3;
gpio_initstructure.gpio_mode = gpio_mode_in_floating;
gpio_init(gpioa, &gpio_initstructure);
// configure usart2 tx (pb.10) as alternate function push-pull
gpio_initstructure.gpio_pin = gpio_pin_2;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_af_pp;
gpio_init(gpioa, &gpio_initstructure);
//配置串口
usart_initstructure.usart_baudrate = bt;
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;
// configure usart3
usart_init(usart2, &usart_initstructure);//配置串口3
// enable usart1 receive interrupts 使能串口接收中断
usart_itconfig(usart2, usart_it_rxne, enable);
//串口发送中断在发送数据时开启
//usart_itconfig(usart2, usart_it_txe, enable);
// enable the usart3
usart_cmd(usart2, enable);//使能串口3
//串口中断配置
//configure the nvic preemption priority bits
nvic_prioritygroupconfig(nvic_prioritygroup_0);
// enable the usart3 interrupt
nvic_initstructure.nvic_irqchannel = usart2_irqn;
nvic_initstructure.nvic_irqchannelsubpriority = 0;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
}
/*******************************************************************************
* 函 数 名 : serial3_init
* 函数功能 : io端口及串口3,时钟初始化函数 b10,b11
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial3_init(u32 bt)
{
usart_inittypedef usart_initstructure;
nvic_inittypedef nvic_initstructure;
gpio_inittypedef gpio_initstructure; //声明一个结构体变量,用来初始化gpio
//使能串口的rcc时钟
rcc_apb2periphclockcmd(rcc_apb2periph_gpiob , enable); //使能uart3所在gpiob的时钟
rcc_apb1periphclockcmd(rcc_apb1periph_usart3, enable);
//串口使用的gpio口配置
// configure usart2 rx (pb.11) as input floating
gpio_initstructure.gpio_pin = gpio_pin_11;
gpio_initstructure.gpio_mode = gpio_mode_in_floating;
gpio_init(gpiob, &gpio_initstructure);
// configure usart2 tx (pb.10) as alternate function push-pull
gpio_initstructure.gpio_pin = gpio_pin_10;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_af_pp;
gpio_init(gpiob, &gpio_initstructure);
//配置串口
usart_initstructure.usart_baudrate = bt;
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;
// configure usart3
usart_init(usart3, &usart_initstructure);//配置串口3
// enable usart1 receive interrupts 使能串口接收中断
usart_itconfig(usart3, usart_it_rxne, enable);
//串口发送中断在发送数据时开启
//usart_itconfig(usart2, usart_it_txe, enable);
// enable the usart3
usart_cmd(usart3, enable);//使能串口3
//串口中断配置
//configure the nvic preemption priority bits
nvic_prioritygroupconfig(nvic_prioritygroup_0);
// enable the usart3 interrupt
nvic_initstructure.nvic_irqchannel = usart3_irqn;
nvic_initstructure.nvic_irqchannelsubpriority = 0;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
}
/*******************************************************************************
* 函 数 名 : serial1_sned_char
* 函数功能 : 串口1发送一字节
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial1_sned_char(u8 temp)
{
usart_senddata(usart1,(u8)temp);
while(usart_getflagstatus(usart1,usart_flag_txe)==reset);
}
/*******************************************************************************
* 函 数 名 : serial1_sned_buff
* 函数功能 : 串口1发送一字符串
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial1_sned_buff(u8 buf[],u32 len)
{
u32 i;
for(i=0;i
serial1_sned_char(buf[i]);
}
/*******************************************************************************
* 函 数 名 : serial2_sned_char
* 函数功能 : 串口2发送一字节
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial2_sned_char(u8 temp)
{
usart_senddata(usart2,(u8)temp);
while(usart_getflagstatus(usart2,usart_flag_txe)==reset);
}
/*******************************************************************************
* 函 数 名 : serial2_sned_buff
* 函数功能 : 串口2发送一字符串
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial2_sned_buff(u8 buf[],u32 len)
{
u32 i;
for(i=0;i
serial2_sned_char(buf[i]);
}
//--------------------------------------------------------------------------------------------------------
/*******************************************************************************
* 函 数 名 : serial3_sned_char
* 函数功能 : 串口3发送一字节
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial3_sned_char(u8 temp)
{
usart_senddata(usart3,(u8)temp);
while(usart_getflagstatus(usart3,usart_flag_txe)==reset);
}
/*******************************************************************************
* 函 数 名 : serial3_sned_buff
* 函数功能 : 串口3发送一字符串
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial3_sned_buff(u8 buf[],u32 len)
{
u32 i;
for(i=0;i
serial3_sned_char(buf[i]);
}
serial.h
**************************************************/
#ifndef _serial_
#define _serial_
#include "stm32f10x.h"
#include "stdio.h"
//------------------------------------------------------------------------------------------
/*******************************************************************************
* 函 数 名 : fputc
* 函数功能 : printf会调用
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
int fputc(int ch,file *p);
/*******************************************************************************
* 函 数 名 : serial1_init
* 函数功能 : io端口及串口1,时钟初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial1_init(u32 bt);
/*******************************************************************************
* 函 数 名 : serial1_sned_char
* 函数功能 : 串口1发送一字节
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial1_sned_char(u8 temp);
/*******************************************************************************
* 函 数 名 : serial1_sned_buff
* 函数功能 : 串口1发送一字符串
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial1_sned_buff(u8 buf[],u32 len);
//-----------------------------------------------------------------------------------------------------
/*******************************************************************************
* 函 数 名 : serial2_init
* 函数功能 : io端口及串口2,时钟初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial2_init(u32 bt);
/*******************************************************************************
* 函 数 名 : serial2_sned_char
* 函数功能 : 串口2发送一字节
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial2_sned_char(u8 temp);
/*******************************************************************************
* 函 数 名 : serial2_sned_buff
* 函数功能 : 串口2发送一字符串
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial2_sned_buff(u8 buf[],u32 len);
//--------------------------------------------------------------------------------------------------------
/*******************************************************************************
* 函 数 名 : serial3_init
* 函数功能 : io端口及串口3,时钟初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial3_init(u32 bt);
/*******************************************************************************
* 函 数 名 : serial3_sned_char
* 函数功能 : 串口3发送一字节
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial3_sned_char(u8 temp);
/*******************************************************************************
* 函 数 名 : serial3_sned_buff
* 函数功能 : 串口3发送一字符串
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void serial3_sned_buff(u8 buf[],u32 len);
串口中断函数处理部分
void usart1_irqhandler(void)
{
usart_clearflag(usart1,usart_flag_tc);
if(usart_getitstatus(usart1,usart_it_rxne)!=bit_reset)//检查指定的usart中断发生与否
{
u8 k=usart_receivedata(usart1);
serial1_sned_char(k 1);
}
}
void usart2_irqhandler(void)
{
usart_clearflag(usart2,usart_flag_tc);
if(usart_getitstatus(usart2,usart_it_rxne)!=bit_reset)//检查指定的usart中断发生与否
{
u8 k=usart_receivedata(usart2);
serial1_sned_char(k 1);
}
}
void usart3_irqhandler(void)
{
usart_clearflag(usart3,usart_flag_tc);
if(usart_getitstatus(usart3,usart_it_rxne)!=bit_reset)//检查指定的usart中断发生与否
{
u8 k=usart_receivedata(usart3);
serial1_sned_char(k 1);
}
}
『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』