|
|
#include "sys.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
//����ʹ��ucos,������������ͷ�ļ�����.
#if SYSTEM_SUPPORT_OS
#include "includes.h" //ucos ʹ��
#endif
//////////////////////////////////////////////////////////////////////////////////
//������ֻ��ѧϰʹ�ã�δ���������ɣ��������������κ���;
//ALIENTEK STM32F407������
//����1��ʼ��
//����ԭ��@ALIENTEK
//������̳:www.openedv.com
//������:2014/5/2
//�汾��V1.1
//��Ȩ���У������ؾ���
//Copyright(C) �������������ӿƼ�����˾ 2014-2024
//All rights reserved
//********************************************************************************
//��˵��
//V1.1 20150411
//��OS_CRITICAL_METHOD���ж�Ϊ��SYSTEM_SUPPORT_OS
//////////////////////////////////////////////////////////////////////////////////
//�������´���,֧��printf����,������Ҫѡ��use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//������Ҫ��֧�ֺ���
struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; /* FILE is typedef�� d in stdio.h. */ FILE __stdout; //����_sys_exit()�Ա���ʹ�ð�����ģʽ
void _sys_exit(int x) { x = x; } //�ض���fputc����
int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//ѭ������,ֱ����������
USART1->DR = (u8) ch; return ch; } #endif
//end
//////////////////////////////////////////////////////////////////
#if EN_USART1_RX //����ʹ���˽���
//����1�жϷ�������
//ע��,��ȡUSARTx->SR�ܱ���Ī�������Ĵ���
u8 USART_RX_BUF[USART_REC_LEN]; //���ջ���,����USART_REC_LEN���ֽ�.
//����״̬
//bit15�� �������ɱ�־
//bit14�� ���յ�0x0d
//bit13~0�� ���յ�����Ч�ֽ���Ŀ
u16 USART_RX_STA=0; //����״̬����
void USART1_IRQHandler(void) { u8 res; #if SYSTEM_SUPPORT_OS //����SYSTEM_SUPPORT_OSΪ�棬����Ҫ֧��OS.
OSIntEnter(); #endif
if(USART1->SR&(1<<5))//���յ�����
{ res=USART1->DR; if((USART_RX_STA&0x8000)==0)//�������
{ if(USART_RX_STA&0x4000)//���յ���0x0d
{ if(res!=0x0a)USART_RX_STA=0;//���մ���,���¿�ʼ
else USART_RX_STA|=0x8000; //����������
}else //��û�յ�0X0D
{ 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 //����SYSTEM_SUPPORT_OSΪ�棬����Ҫ֧��OS.
OSIntExit(); #endif
} #endif
//��ʼ��IO ����1
//pclk2:PCLK2ʱ��Ƶ��(Mhz)
//bound:������
void uart_init(u32 pclk2,u32 bound) { float temp; u16 mantissa; u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);//�õ�USARTDIV@OVER8=0
mantissa=temp; //�õ���������
fraction=(temp-mantissa)*16; //�õ�С������@OVER8=0
mantissa<<=4; mantissa+=fraction; RCC->AHB1ENR|=1<<0; //ʹ��PORTA��ʱ��
RCC->APB2ENR|=1<<4; //ʹ�ܴ���1ʱ��
GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,���ù���,��������
GPIO_AF_Set(GPIOA,9,7); //PA9,AF7
GPIO_AF_Set(GPIOA,10,7);//PA10,AF7
//����������
USART1->BRR=mantissa; //����������
USART1->CR1&=~(1<<15); //����OVER8=0
USART1->CR1|=1<<3; //���ڷ���ʹ��
#if EN_USART1_RX //����ʹ���˽���
//ʹ�ܽ����ж�
USART1->CR1|=1<<2; //���ڽ���ʹ��
USART1->CR1|=1<<5; //���ջ������ǿ��ж�ʹ��
MY_NVIC_Init(3,3,USART1_IRQn,2);//��2���������ȼ�
#endif
USART1->CR1|=1<<13; //����ʹ��
}
|