初级会员

- 积分
- 117
- 金钱
- 117
- 注册时间
- 2019-5-23
- 在线时间
- 26 小时
|

楼主 |
发表于 2020-1-15 09:51:21
|
显示全部楼层
我的单片机是STM32F103VET6。以下是程序:
#include "sys.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
#if SYSTEM_SUPPORT_OS
#include "includes.h" //ucos ê1óÃ
#endif
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
//ÖØ¶¨òåfputcoˉêy
int fputc(int ch, FILE *f)
{
while((UART4->SR&0X40)==0);//Ñ-»··¢Ëí,Ö±μ½·¢Ëííê±Ï
UART4->DR = (u8) ch;
return ch;
}
#endif
#if EN_USART1_RX //èç1ûê1Äüá˽óêÕ
//′®¿ú4ÖD¶Ï·tÎñ3ìDò
//×¢òa,¶áè¡USARTx->SRÄü±üÃaÄaÃûÆäÃîμÄ′íÎó
u8 USART_RX_BUF[USART_REC_LEN]; //½óêÕ»o3å,×î′óUSART_REC_LEN¸ö×Ö½ú.
u16 USART_RX_STA=0;
void uart_init(u32 bound){
//
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//UART4_TX GPIOC.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//UART4_RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PC11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//
GPIO_Init(GPIOC, &GPIO_InitStructure);//
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
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(UART4, &USART_InitStructure); //
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//
USART_Cmd(UART4, ENABLE); //
}
void UART4_IRQHandler(void) //
{
u8 Res;
#if SYSTEM_SUPPORT_OS //
OSIntEnter();
#endif
if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) //
{
Res =USART_ReceiveData(UART4); //
if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)//
{
if(Res!=0x0a)USART_RX_STA=0;//
else USART_RX_STA|=0x8000;
}
else
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
}
}
}
}
#if SYSTEM_SUPPORT_OS //
OSIntExit();
#endif
}
#endif
|
|