|
大家好,麻煩大家幫忙看一下,最近在做stm32f103和紙幣器的串行通信,我使用串口助手和紙幣器進行通信,可以看到每隔兩秒紙幣器發送80 8f(十六進制),當紙幣器接收到02H,就不發送了,并且可以開始吸收紙幣了,但是我用單片機連接就不行了,麻煩大家看下程序:
#include "stm32f10x.h"
void Delay_MS(u16 dly);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void NVIC_Config(void);
extern u8 RxData[3];
void Delay_MS(u16 dly)
{
u16 i,j;
for(i=0;i<dly;i++)
for(j=1000;j>0;j--);
}
void RCC_Configuration(void)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
while(RCC_WaitForHSEStartUp()== ERROR);
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
// RCC_APB1PeriphClockCmd (RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
}
void GPIO_Configuration(void)
{ GPIO_InitTypeDef GPIO_InitStructure; //聲明一個結構體變量
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //管腳頻率為50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOC寄存器
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管腳頻率為50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void USART_Configuration(void)
{ USART_InitTypeDef U1;
U1.USART_BaudRate =9600;
U1.USART_WordLength = USART_WordLength_9b;
U1.USART_StopBits = USART_StopBits_1;
U1.USART_Parity = USART_Parity_Even;
U1.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
U1.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_DeInit(USART1);
USART_Init(USART1, &U1);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_Cmd(USART1,ENABLE);
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //采用組別2
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置串口中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先式優先級設置為0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副優先級設置為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中斷使能
NVIC_Init(&NVIC_InitStructure);//中斷初始化
}
int main()
{ int flag=1;
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
NVIC_Config();
while(1)
{
while(flag)
{
if((RxData[0]==0x80)&&(RxData[1]==0x8F))
{
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
USART_SendData(USART1,0x02);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET)
{
}
flag=0;
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
if((RxData[1]==0x80)&&(RxData[2]==0x8F))
{
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
USART_SendData(USART1,0x02);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET)
{
}
flag=0;
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
if((RxData[2]==0x80)&&(RxData[0]==0x8F))
{
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
USART_SendData(USART1,0x02);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET)
{
}
flag=0;
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
}
}
}
子程序
u8 RxData[3]={0};
void USART1_IRQHandler(void)
{
static u8 num=0;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
RxData[num]=USART_ReceiveData(USART1);
num++;
}
if(num==3)
num=0;
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出
{
USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR
USART_ReceiveData(USART2); //讀DR
}
|
|