|
楼主 |
发表于 2014-7-20 23:58:26
|
显示全部楼层
#include"stdio.h"
#include"stm32f10x.h"
void uart_init(uint32_t pclk2,uint32_t bound);
void USART1_IRQHandler(void);
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);
void MY_NVIC_Init(u8 NVIC_PreemptionPriority, u8 NVIC_SubPriority, u8 NVIC_Channel,u8 NVIC_Group);
int main(void)
{
RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_IOPBEN;
GPIOB->CRH|=(uint32_t)(GPIO_CRH_CNF10_0|GPIO_CRH_MODE10);
uart_init(72,9600);
while(1)
{
}
}
void uart_init(uint32_t pclk2,uint32_t bound)
{
float temp;
uint16_t mantissa;
uint16_t fraction;
temp=(float)(pclk2*1000000)/(bound*16);
mantissa=temp;
fraction=(temp-mantissa)*16;
mantissa<<=4;
mantissa+=fraction;
//UART1³õʼ»¯
RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_IOPAEN; //´ò¿ªGPIOAʱÖÓ
RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_USART1EN; //´ò¿ª´®¿ÚʱÖÓ
RCC->APB2RSTR|=(uint32_t)(RCC_APB2RSTR_USART1RST); //¸´Î»´®¿Ú1
RCC->APB2RSTR&=~(uint32_t)(RCC_APB2RSTR_USART1RST); //Í£Ö¹¸´Î»´®¿Ú1
GPIOA->CRH|=(uint32_t)(GPIO_CRH_CNF9_1|GPIO_CRH_MODE9); //TXÍÆÍ츴Óù¦ÄÜÊä³ö
GPIOA->CRH&=~(uint32_t)GPIO_CRH_CNF9_0;
GPIOA->CRH|=(uint32_t)(GPIO_CRH_CNF10_0); //RX¸¡¿ÕÊäÈë
USART1->CR1|=(uint32_t)USART_CR1_UE; //UE=1£¬¼¤»îUSART1
USART1->BRR=mantissa; //ÉèÖò¨ÌØÂÊ
USART1->CR1|=(uint32_t)USART_CR1_TE; //TE=1£¬·¢ËÍʹÄÜ
USART1->CR1|=(uint32_t)USART_CR1_RE; //RE=1£¬½ÓÊÜʹÄÜ
MY_NVIC_Init(1,1,37,2);
USART1->CR1|=(uint32_t)USART_CR1_RXNEIE; //½ÓÊÕ»º³åÇø·Ç¿ÕÖжÏʹÄÜ
}
void MY_NVIC_Init(u8 NVIC_PreemptionPriority, u8 NVIC_SubPriority, u8 NVIC_Channel,u8 NVIC_Group)
{
u32 temp;
MY_NVIC_PriorityGroupConfig(NVIC_Group);
temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf;
if(NVIC_Channel<32)
NVIC->ISER[0]|=1<<NVIC_Channel;
else
NVIC->ISER[1]|=1<<(NVIC_Channel-32);
NVIC->IP[NVIC_Channel]|=temp<<4;
}
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
{
u32 temp,temp1;
temp1=(~NVIC_Group)&0x07;
temp1<<=8;
temp=SCB->AIRCR;
temp&=0X0000F8FF;
temp|=0X05FA0000;
temp|=temp1;
SCB->AIRCR=temp;
}
void USART1_IRQHandler(void)
{
uint8_t temp;
GPIOB->ODR=~GPIOB->ODR;
if(USART1->SR&USART_SR_RXNE)
{
temp=USART1->DR;
USART1->DR=temp;
while(!((USART1->SR)&USART_SR_TC));
}
}
问题解决了,上面加粗的部分是新加的代码(就是把正点原子的代码做了很小的改动)。然后就实现了我要的功能。 |
|