原子哥求助关于DMA。
u16 DMA1_MEM_LEN;
void MYDMA_ConfigCH6(u32 cpar,u32 cmar,u16 cndtr)
{
RCC->AHBENR|=1<<0; //????DMA1?±??
delay_ms(3); //????DMA?±?????¨
DMA1_Channel6->CPAR=cpar; //DMA1 ???è???·
DMA1_Channel6->CMAR=(u32)cmar; //DMA1,?????÷???·
DMA1_MEM_LEN=cndtr; //±???DMA??????????
DMA1_Channel6->CNDTR=cndtr; //DMA1,??????????
DMA1_Channel6->CCR=0X00000000; //????
DMA1_Channel6->CCR&=~(1<<4); //???????÷?? ???????????è??
DMA1_Channel6->CCR|=1<<5; // ????????·????
DMA1_Channel6->CCR|=0<<6; //???è???··?????????
DMA1_Channel6->CCR|=1<<7; //?????÷????????
DMA1_Channel6->CCR|=0<<8; //???è?????í????8??
DMA1_Channel6->CCR|=0<<10; //?????÷?????í??8??
DMA1_Channel6->CCR|=1<<12; //??????????
DMA1_Channel6->CCR|=0<<14; //·??????÷???????÷????
DMA1_Channel6->CCR|=1<<0; //????DMA??????
}
//????????DMA????
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_CHx->CCR&=~(1<<0); //??±?DMA????
DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,??????????
DMA_CHx->CCR|=1<<0; //????DMA????
}
//?®??2??????
void USART2_Config(void) //?????? ????USART2
{
GPIO_InitTypeDef GPIO_InitStructure; //?®???????????á????±???
USART_InitTypeDef USART_InitStructure; //?®???????????á????±???
//???? USART2 ?±??
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //?ò???®???????±??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //?ò??PA?????±??
//??USART2 Tx?¨·??????©??GPIO?????????ì????????
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //???¨????IO?? ?????¨PA2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //???????ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //?è?¨IO??????????????50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //??????GPIOA
//??USART2 Rx?¨???????©??GPIO??????????????????
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //???¨????IO?? ?????¨PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //????????
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //???????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //??????GPIOA
//????USART2????
USART_InitStructure.USART_BaudRate = 115200; //?¨?????è????115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //?????????è????8??
USART_InitStructure.USART_StopBits = USART_StopBits_1; //???????è????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); //??????USART2
//?ò??·?????????????????(?????è??????)
//USART_ITConfig(USART2, USART_IT_TXE, ENABLE); // ???????¨??USART2·???????
// USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // ???????¨??USART2????????
//???? USART2?? ?????ê±?
USART_Cmd(USART2, ENABLE); // USART2????
//??????????????1??×?????·¨???··?????????????
// USART_ClearFlag(USART2, USART_FLAG_TC); //???®??2·???±ê??
}
int main(void)
{
delay_init(); //???±??????????
OLED_Init(); //??????OLED
OLED_ShowString(0,0, " x aixs: ");
OLED_ShowString(0,16," y aixs: ");
OLED_ShowString(0,32," z axis: ");
OLED_ShowString(0,48," speed: ");
OLED_Refresh_Gram();
TIM3_PWM_Init(899,0);//??·?????PWM????=72000/(899+1)=80Khz 899×??ó
USART2_Config();//?®????????
USART2->CR3|=1<<6;//????DMA ?®????????
MYDMA_ConfigCH6((u32)&USART2->DR,(u32)Re_buf,12);
while(1)
{
if(Re_buf[3]!=0)
OLED_ShowNum(103,48,Re_buf[3],3,16);
OLED_Refresh_Gram();
if(Re_buf[0]==0x55) //?ì?é???·
{
switch(Re_buf[1])
{
case 0x51: //±ê??????°ü????????°ü
a[0] = ((short)(Re_buf[3]<<8 | Re_buf[2]))/32768.0*16; //CESHI //X?á??????
a[1] = ((short)(Re_buf[5]<<8 | Re_buf[4]))/32768.0*16; //Y?á??????
a[2] = ((short)(Re_buf[7]<<8 | Re_buf[6]))/32768.0*16; //Z?á??????
T = ((short)(Re_buf[9]<<8 | Re_buf[8]))/340.0+36.25; //????
break;
case 0x52: //±ê??????°ü????????°ü
w[0] = ((short)(Re_buf[3]<<8| Re_buf[2]))/32768.0*2000; //X?á??????
w[1] = ((short)(Re_buf[5]<<8| Re_buf[4]))/32768.0*2000; //Y?á??????
w[2] = ((short)(Re_buf[7]<<8| Re_buf[6]))/32768.0*2000; //Z?á??????
T = ((short)(Re_buf[9]<<8| Re_buf[8]))/340.0+36.25; //????
break;
case 0x53: //±ê??????°ü??????°ü
angle[0] = ((short)(Re_buf[3]<<8| Re_buf[2]))/32768.0*180; //X?á??×????¨x ?á?©
angle[1] = ((short)(Re_buf[5]<<8| Re_buf[4]))/32768.0*180; //Y?á?©?????¨y ?á?©
angle[2] = ((short)(Re_buf[7]<<8| Re_buf[6]))/32768.0*180; //Z?á???????¨z ?á?©
T = ((short)(Re_buf[9]<<8| Re_buf[8]))/340.0+36.25; //????
//printf("X?á??????%.2f Y?á??????%.2f Z?á??????%.2f\r\n",angle[0],angle[1],angle[2]);
break;
default: break;
}
}
LEFT_PWM_VAL_Z=300;
LEFT_PWM_VAL_F=450;
RIGHT_PWM_VAL_Z=300;
RIGHT_PWM_VAL_F=450;
}
}
这么配置串口2,有没有错?oled没有显示到数据,调了几天了。
|