初级会员

- 积分
- 84
- 金钱
- 84
- 注册时间
- 2018-7-12
- 在线时间
- 17 小时
|
#include "stm32f10x.h"
void My_USART2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue;//定义IO接口结构体
USART_InitTypeDef USART_InitStrue;//定义串口相关结构体
NVIC_InitTypeDef NVIC_InitStrue;//定义中断相关结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//初始化GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//初始化串口USART时钟
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);//GPIOA11初始化
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//推挽复用输出
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;//开启2号IO口
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;//端口速度50MHz
GPIO_Init(GPIOA,&GPIO_InitStrue);//GPIOA2初始化
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;//开启3号IO口
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;//端口速度50MHz
GPIO_Init(GPIOA,&GPIO_InitStrue);//GPIO3初始化
USART_InitStrue.USART_BaudRate=9600;//串口波特率设置
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流
USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//发送,接收使能
USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验
USART_InitStrue.USART_StopBits=USART_StopBits_1;//停止位为1
USART_InitStrue.USART_WordLength=USART_WordLength_8b;//字长8位
USART_Init(USART2,&USART_InitStrue);//USART2初始化
USART_Cmd(USART2,ENABLE);//使能串口2
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//中断配置:开启接收中断(接受缓存器非空使能,ENABLE)
NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;//定义中断通道
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//开启中断通道
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//设定抢占优先级为1
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//设定子优先级为1
NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStrue);//中断初始化
}
void delay(unsigned int a)
{
unsigned int i;
while(--a!=0){
for(i=0;i<600;i++);
}
}
void Send_Msg(void)
{
int Msg[9]={0x01,0x03,0x28,0x00,0x00,0x02,0xcd,0xab};
int i;
for(i=0;i<8;i++)
{
delay(500);
USART_SendData(USART2,Msg[i]);
}
}
uint8_t aRxBuffer[100]={0x00};
uint8_t RxCounter=0;
uint8_t ReceiverState=0;
void USART2_IRQHangler(void)
{
uint8_t Clear=Clear;
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
{
aRxBuffer[RxCounter++]=USART2->DR;
}
else if(USART_GetITStatus(USART2,USART_IT_IDLE)!=RESET)
{
Clear=USART2->SR;
Clear=USART2->DR;
ReceiverState=1;
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设定优先级分组为2,2位抢占2位响应
My_USART2_Init();//调用串口函数
GPIO_SetBits(GPIOA,GPIO_Pin_11);
Send_Msg();
uint8_t i=0;
if(ReceiverState==1)
{
ReceiverState=0;
i=0;
while(RxCounter--)
{
USART_SendData(USART2,aRxBuffer[i++]);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
}
RxCounter=0;
}
while(1)
{
}
}
|
|