STM32串口例程和stm32虚拟串口例程。非常不错的
资料,
STM32串口程序的一般配置方法
#include "stm32f10x.h"
/************************************************
该程序讲解串口程序的一般配置方法:
步骤为:
1、先对
端口进行复用或者重映射操作(该程序中是对端口进行复用操作)
2、串口复位,函数为USART_DeInit();
3、串口初始化:USART_Init();
4、中断初始化: NVIC_Init();
5、串口使能:USART_Cmd();
6、开启中断:USART_ITConfig();
7、编写中断处理函数:void USART1_IRQHandler(void)
briangooole@gmail.com
于2017年06月29日
-------------------------
USART_TX | PA9
-------------------------
USART_RX | PA10
-------------------------
************************************************/
void MY_USART_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue; //在GPIO_Init函数调用时需定义一个GPIO_InitTypeDef结构体类型变量
USART_InitTypeDef USART_InitStrue; //USART_Init函数调用时需定义一个USART_InitTypeDef结构体类型变量
NVIC_InitTypeDef NVIC_InitStrue; //USART_Init函数调用时需定义一个NVIC_InitTypeDef结构体类型变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//由于串口功能是GPIO的第二功能,所以要对端口进行复用操作,
//一般步骤为:GPIO
时钟使能-》复用的外设时钟使能-》将端口按照复用的功能进行模式配置
USART_DeInit(USART1); //串口复位
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; //复用功能推挽输出模式
GPIO_InitStrue.GPIO_
Pin=GPIO_Pin_9; //PA9
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz; //设置输出速度
GPIO_Init(GPIOA,&GPIO_InitStrue);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入模式
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; //PA10
GPIO_Init(GPIOA,&GPIO_InitStrue);
USART_InitStrue.USART_BaudRa
te=9600;//设置波特率9600
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制,相关
寄存器为CR3
USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//模式为接收和发送
USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验位0x0000,相关寄存器为SR1的PS位
USART_InitStrue.USART_StopBits=USART_StopBits_1; //1个停止位
USART_InitStrue.USART_W
ordLength=USART_WordLength_8b; //数据长度为8位
USART_Init(USART1,&USART_InitStrue); //串口初始化
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn; //串口1对应的中断名称
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; //使能该中断通道
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级为2,因为此程序只有一个中断,故可任意设置
NVIC_InitStrue.NVIC_IRQChannel
SubPriority=1;//响应优先级为1,因为此程序只有一个中断,故可任意设置
NVIC_Init(&NVIC_InitStrue); //中断初始化
USART_Cmd(USART1,ENABLE); //串口使能 就是将寄存器CR1中的UE位置1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能串口中断,也叫开启串口中断,第二个
参数是设置具体开启哪种中断,具体为寄存器SR
}
void USART1_IRQHandler(void) //中断函数
{
u16 DATA;
if(USART_GetITStatus(USART1,USART_IT_RXNE))//判断如果收到了数据,收到数据CR1中RXNE位为1,该函数的返回值为1,则执行if包含的语句
{
DATA=USART_ReceiveData(USART1);//读取数据
USART_SendData(USART1,DATA);//发送读到的数据
}
}
int main(void) //主函数
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//进行中断分组,分为2组:2位抢占优先级,2位响应优先级
MY_USART_Init(); //调用串口初始化函数
while(1); //等待中端发生
}
STM32串口库函数版例程
定义:
TXD1----- PA9-US1-TX
RXD1----- PA10-US1-RX
速率:115200,n,8,1
-
-
#include "stm32f10x.h"
-
#include "platform_config.h"
-
#include "stm32f10x_usart.h"
-
#include "misc.h"
-
#include "stdarg.h"
-
-
-
-
-
USART_InitTypeDef USART_InitStructure;
-
uint8_t TxBuffer1[] = "USART Interrupt Example: This is USART1 DEMO";
-
uint8_t RxBuffer1[],rec_f,tx_flag;
-
__IO uint8_t TxCounter1 = 0x00;
-
__IO uint8_t RxCounter1 = 0x00;
-
-
uint32_t Rec_Len;
-
-
-
-
void RCC_Configuration(void);
-
void GPIO_Configuration(void);
-
void NVIC_Configuration(void);
-
-
void Delay(__IO uint32_t nCount);
-
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);
-
char *itoa(int value, char *string, int radix);
-
void USART_Config(USART_TypeDef* USARTx);
-
-
-
GPIO_InitTypeDef GPIO_InitStructure;
-
USART_InitTypeDef USART_InitStruct;
-
USART_ClockInitTypeDef USART_ClockInitStruct;
-
-
-
-
-
-
-
-
-
-
-
-
-
void USART_Config(USART_TypeDef* USARTx){
-
USART_InitStructure.USART_BaudRate = 115200;
-
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(USARTx, &USART_InitStructure);
-
-
-
-
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
-
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
-
-
-
USART_Cmd(USART1, ENABLE);
-
}
-
-
-
-
-
-
-
-
-
int main(void)
-
{
-
-
uint8_t a=0;
-
-
RCC_Configuration();
-
-
-
-
NVIC_Configuration();
-
-
-
-
-
GPIO_Configuration();
-
-
USART_Config(USART1);
-
-
USART_OUT(USART1,"****测试串口 *******\r\n");
-
-
USART_OUT(USART1,"***************************************************\r\n");
-
USART_OUT(USART1,"\r\n");
-
USART_OUT(USART1,"\r\n");
-
while (1)
-
{
-
if(rec_f==1){
-
rec_f=0;
-
USART_OUT(USART1,"\r\n您发送的信息为: \r\n");
-
USART_OUT(USART1,&TxBuffer1[0]);
-
if(a==0) {GPIO_SetBits(GPIOB, GPIO_Pin_5); a=1;}
-
else {GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=0; }
-
}
-
}
-
}
-
-
-
-
-
-
-
-
-
-
void Delay(__IO uint32_t nCount)
-
{
-
for(; nCount != 0; nCount--);
-
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){
-
const char *s;
-
int d;
-
char buf[16];
-
va_list ap;
-
va_start(ap, Data);
-
-
while(*Data!=0){
-
if(*Data==0x5c){
-
switch (*++Data){
-
case 'r':
-
USART_SendData(USARTx, 0x0d);
-
-
Data++;
-
break;
-
case 'n':
-
USART_SendData(USARTx, 0x0a);
-
Data++;
-
break;
-
-
default:
-
Data++;
-
break;
-
}
-
-
-
}
-
else if(*Data=='%'){
-
switch (*++Data){
-
case 's':
-
s = va_arg(ap, const char *);
-
for ( ; *s; s++) {
-
USART_SendData(USARTx,*s);
-
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
-
}
-
Data++;
-
break;
-
case 'd':
-
d = va_arg(ap, int);
-
itoa(d, buf, 10);
-
for (s = buf; *s; s++) {
-
USART_SendData(USARTx,*s);
-
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
-
}
-
Data++;
-
break;
-
default:
-
Data++;
-
break;
-
}
-
}
-
else USART_SendData(USARTx, *Data++);
-
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
-
}
-
}
-
-
-
-
-
-
-
-
-
-
-
-
char *itoa(int value, char *string, int radix)
-
{
-
int i, d;
-
int flag = 0;
-
char *ptr = string;
-
-
-
if (radix != 10)
-
{
-
*ptr = 0;
-
return string;
-
}
-
-
if (!value)
-
{
-
*ptr++ = 0x30;
-
*ptr = 0;
-
return string;
-
}
-
-
-
if (value < 0)
-
{
-
*ptr++ = '-';
-
-
-
value *= -1;
-
}
-
-
for (i = 10000; i > 0; i /= 10)
-
{
-
d = value / i;
-
-
if (d || flag)
-
{
-
*ptr++ = (char)(d + 0x30);
-
value -= (d * i);
-
flag = 1;
-
}
-
}
-
-
-
*ptr = 0;
-
-
return string;
-
-
}
-
-
-
-
-
-
-
-
-
-
void RCC_Configuration(void)
-
{
-
SystemInit();
-
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO , ENABLE);
-
}
-
-
-
-
-
-
-
-
-
-
void GPIO_Configuration(void)
-
{
-
-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-
GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-
GPIO_Init(GPIOA, &GPIO_InitStructure);
-
-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
-
GPIO_Init(GPIOA, &GPIO_InitStructure);
-
}
-
-
-
-
-
-
-
-
-
-
void NVIC_Configuration(void)
-
{
-
-
NVIC_InitTypeDef NVIC_InitStructure;
-
-
-
-
-
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
-
-
-
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);
-
}
-
-
-
-
-
-
-
-
-
-
-
void USART1_IRQHandler(void)
-
{
-
unsigned int i;
-
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
-
{
-
-
RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);
-
-
if(RxBuffer1[RxCounter1-2]==0x0d&&RxBuffer1[RxCounter1-1]==0x0a)
-
{
-
for(i=0; i< RxCounter1; i++) TxBuffer1[i] = RxBuffer1[i];
-
rec_f=1;
-
TxBuffer1[RxCounter1]=0;
-
RxCounter1=0;
-
-
}
-
}
-
-
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
-
{
-
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
-
}
-
-
}
评论
查看更多