新手入门
- 积分
- 4
- 金钱
- 4
- 注册时间
- 2017-12-23
- 在线时间
- 2 小时
|

楼主 |
发表于 2018-7-10 16:31:28
|
显示全部楼层
_align(8) u8 USART2_TX_BUF[USART2_MAX_SEND_LEN]; //·¢ËÍ»º³å,×î´óUSART2_MAX_SEND_LEN×Ö½Ú
#ifdef USART2_RX_EN //Èç¹ûʹÄÜÁ˽ÓÊÕ
//´®¿Ú½ÓÊÕ»º´æÇø
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; //½ÓÊÕ»º³å,×î´óUSART2_MAX_RECV_LEN¸ö×Ö½Ú.
//ͨ¹ýÅжϽÓÊÕÁ¬Ðø2¸ö×Ö·ûÖ®¼äµÄʱ¼ä²î²»´óÓÚ10msÀ´¾ö¶¨ÊDz»ÊÇÒ»´ÎÁ¬ÐøµÄÊý¾Ý.
//Èç¹û2¸ö×Ö·û½ÓÊÕ¼ä¸ô³¬¹ý10ms,ÔòÈÏΪ²»ÊÇ1´ÎÁ¬ÐøÊý¾Ý.Ò²¾ÍÊdz¬¹ý10msûÓнÓÊÕµ½
//ÈκÎÊý¾Ý,Ôò±íʾ´Ë´Î½ÓÊÕÍê±Ï.
//½ÓÊÕµ½µÄÊý¾Ý״̬
//[15]:0,ûÓнÓÊÕµ½Êý¾Ý;1,½ÓÊÕµ½ÁËÒ»ÅúÊý¾Ý.
//[14:0]:½ÓÊÕµ½µÄÊý¾Ý³¤¶È
u16 USART2_RX_STA=0;
void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//½ÓÊÕµ½Êý¾Ý
{ LCD_ShowString(30,40,209,119,16,"Range_deca[0]");
res =USART_ReceiveData(USART2);
if(USART2_RX_STA<USART2_MAX_RECV_LEN) //»¹¿ÉÒÔ½ÓÊÕÊý¾Ý
{
TIM_SetCounter(TIM4,0);//¼ÆÊýÆ÷Çå¿Õ
if(USART2_RX_STA==0)TIM4_Set(1); //ʹÄܶ¨Ê±Æ÷4µÄÖжÏ
USART2_RX_BUF[USART2_RX_STA++]=res; //¼Ç¼½ÓÊÕµ½µÄÖµ
LCD_ShowString(30,60,209,119,16,res);
LCD_ShowString(30,80,209,119,16,"Range_deca[0]");
}else
{
USART2_RX_STA|=1<<15; //Ç¿ÖÆ±ê¼Ç½ÓÊÕÍê³É
LCD_ShowString(30,100,209,119,16,"Range_deca[0]");
}
}
}
//³õʼ»¯IO ´®¿Ú2
//pclk1 CLK1ʱÖÓÆµÂÊ(Mhz)
//bound:²¨ÌØÂÊ
void USART2_Init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOAʱÖÓ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
USART_DeInit(USART2); //¸´Î»´®¿Ú2
//USART2_TX PA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö
GPIO_Init(GPIOA, &GPIO_InitStructure); //³õʼ»¯ A2
//USART2_RX PA.3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë
GPIO_Init(GPIOA, &GPIO_InitStructure); //³õʼ»¯ A3
USART_InitStructure.USART_BaudRate = bound;//Ò»°ãÉèÖÃΪ9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
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(USART2, &USART_InitStructure); //³õʼ»¯´®¿Ú 2
//²¨ÌØÂÊÉèÖÃ
// USART2->BRR=(pclk1*1000000)/(bound);// ²¨ÌØÂÊÉèÖÃ
//USART2->CR1|=0X200C; //1λֹͣ,ÎÞУÑéλ.
USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE); //ʹÄÜ´®¿Ú2µÄDMA·¢ËÍ
UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)USART2_TX_BUF);//DMA1ͨµÀ7,ÍâÉèΪ´®¿Ú2,´æ´¢Æ÷ΪUSART2_TX_BUF
USART_Cmd(USART2, ENABLE); //ʹÄÜ´®¿Ú
#ifdef USART2_RX_EN //Èç¹ûʹÄÜÁ˽ÓÊÕ
//ʹÄܽÓÊÕÖжÏ
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//¿ªÆôÖжÏ
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//ÇÀÕ¼ÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×ÓÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
TIM4_Init(999,7199); //10msÖжÏ
USART2_RX_STA=0; //ÇåÁã
TIM4_Set(0); //¹Ø±Õ¶¨Ê±Æ÷4
#endif
}
//´®¿Ú2,printf º¯Êý
//È·±£Ò»´Î·¢ËÍÊý¾Ý²»³¬¹ýUSART2_MAX_SEND_LEN×Ö½Ú
void u2_printf(char* fmt,...)
{
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART2_TX_BUF,fmt,ap);
va_end(ap);
while(DMA_GetCurrDataCounter(DMA1_Channel7)!=0); //µÈ´ýͨµÀ7´«ÊäÍê³É
UART_DMA_Enable(DMA1_Channel7,strlen((const char*)USART2_TX_BUF)); //ͨ¹ýdma·¢ËͳöÈ¥
}
//¶¨Ê±Æ÷4ÖжϷþÎñ³ÌÐò
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//ÊǸüÐÂÖжÏ
{
USART2_RX_STA|=1<<15; //±ê¼Ç½ÓÊÕÍê³É
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //Çå³ýTIMx¸üÐÂÖжϱêÖ¾
TIM4_Set(0); //¹Ø±ÕTIM4
}
}
//ÉèÖÃTIM4µÄ¿ª¹Ø
//sta:0£¬¹Ø±Õ;1,¿ªÆô;
void TIM4_Set(u8 sta)
{
if(sta)
{
TIM_SetCounter(TIM4,0);//¼ÆÊýÆ÷Çå¿Õ
TIM_Cmd(TIM4, ENABLE); //ʹÄÜTIMx
}else TIM_Cmd(TIM4, DISABLE);//¹Ø±Õ¶¨Ê±Æ÷4
}
//ͨÓö¨Ê±Æ÷Öжϳõʼ»¯
//ÕâÀïʼÖÕÑ¡ÔñΪAPB1µÄ2±¶£¬¶øAPB1Ϊ36M
//arr£º×Ô¶¯ÖØ×°Öµ¡£
//psc£ºÊ±ÖÓÔ¤·ÖƵÊý
void TIM4_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //ʱÖÓʹÄÜ//TIM4ʱÖÓʹÄÜ
//¶¨Ê±Æ÷TIM3³õʼ»¯
TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ
TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓÆµÂʳýÊýµÄÔ¤·ÖƵֵ
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //ʹÄÜÖ¸¶¨µÄTIM4ÖжÏ,ÔÊÐí¸üÐÂÖжÏ
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//ÇÀÕ¼ÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //×ÓÓÅÏȼ¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
}
#endif
///////////////////////////////////////USART2 DMA·¢ËÍÅäÖò¿·Ö//////////////////////////////////
//DMA1µÄ¸÷ͨµÀÅäÖÃ
//ÕâÀïµÄ´«ÊäÐÎʽÊǹ̶¨µÄ,ÕâµãÒª¸ù¾Ý²»Í¬µÄÇé¿öÀ´ÐÞ¸Ä
//´Ó´æ´¢Æ÷->ÍâÉèģʽ/8λÊý¾Ý¿í¶È/´æ´¢Æ÷ÔöÁ¿Ä£Ê½
//DMA_CHx MAͨµÀCHx
//cpar:ÍâÉèµØÖ·
//cmar:´æ´¢Æ÷µØÖ·
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //ʹÄÜDMA´«Êä
DMA_DeInit(DMA_CHx); //½«DMAµÄͨµÀ1¼Ä´æÆ÷ÖØÉèΪȱʡֵ
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMAÍâÉèADC»ùµØÖ·
DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMAÄÚ´æ»ùµØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //Êý¾Ý´«Êä·½Ïò£¬´ÓÄÚ´æ¶ÁÈ¡·¢Ë͵½ÍâÉè
DMA_InitStructure.DMA_BufferSize = 0; //DMAͨµÀµÄDMA»º´æµÄ´óС
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //ÍâÉèµØÖ·¼Ä´æÆ÷²»±ä
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //ÄÚ´æµØÖ·¼Ä´æÆ÷µÝÔö
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //Êý¾Ý¿í¶ÈΪ8λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //Êý¾Ý¿í¶ÈΪ8λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //¹¤×÷ÔÚÕý³£»º´æÄ£Ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMAͨµÀ xÓµÓÐÖÐÓÅÏȼ¶
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMAͨµÀxûÓÐÉèÖÃΪÄÚ´æµ½ÄÚ´æ´«Êä
DMA_Init(DMA_CHx, &DMA_InitStructure); //¸ù¾ÝDMA_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯DMAµÄͨµÀUSART1_Tx_DMA_ChannelËù±êʶµÄ¼Ä´æÆ÷
}
//¿ªÆôÒ»´ÎDMA´«Êä
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len)
{
DMA_Cmd(DMA_CHx, DISABLE ); //¹Ø±Õ ָʾµÄͨµÀ
DMA_SetCurrDataCounter(DMA_CHx,len);//DMAͨµÀµÄDMA»º´æµÄ´óС
DMA_Cmd(DMA_CHx, ENABLE); //¿ªÆôDMA´«Êä
} |
|