初级会员

- 积分
- 51
- 金钱
- 51
- 注册时间
- 2016-6-3
- 在线时间
- 15 小时
|
5金钱
求大神指点!在while用USART_SendData( USART1,0x11);试了一下可以发,但是用DMA发送一次后进入startup_stm32f0xx_ld.s就出不来了
下面是部分函数
int main(void)
{
u8 i,j,k;
SYSCLK1_Config();
GPIO_ConfigInit();
Usart1_InitConfig(2,9,2);
Nvic_ConfigInit();
while(1)
{
Usart1_BufSend(zhen111,5);
DMAChanal2_InitConfig(Usart1DR_Add,Usart1_TxBuf,(u32) Usart1Tx_Num);
}
}
void Nvic_ConfigInit(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 4;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = SPI1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 5;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 7;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority =0x02;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void Usart1_InitConfig(u16 ComBaud,u16 Datlenth, u16 parity)
{
USART_InitTypeDef USART_InitStruct;
u16 tempdatlenth = 0;
u16 tempparity = 0;
u32 baudrate;
switch(ComBaud)
{
case _B2400:
baudrate = 2400;
break;
case _B4800:
baudrate = 4800;
break;
case _B9600:
baudrate = 9600;
break;
case _B19200:
baudrate = 19200;
break;
case _B38400:
baudrate = 38400;
break;
case _B57600:
baudrate = 57600;
break;
case _B115200:
baudrate = 115200;
break;
default:
baudrate = 9600;
break;
}
if(Datlenth == 9)
{
tempdatlenth = USART_WordLength_9b;
}
else
{
tempdatlenth = USART_WordLength_8b;
parity = 0;
}
if(!parity)
{
tempparity = USART_Parity_No;
}
else if(parity == 1)
{
tempparity = USART_Parity_Odd;
}
else
{
tempparity = USART_Parity_Even;
}
USART_DeInit(USART1);
USART_InitStruct.USART_BaudRate = baudrate;
USART_InitStruct.USART_WordLength = tempdatlenth;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = tempparity;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_InitStruct);
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
USART_DMACmd(USART1, USART_DMAReq_Rx|USART_DMAReq_Tx, ENABLE);
USART_Cmd(USART1, ENABLE);
}
void USART1_IRQHandler(void) //TIM1_UP_IRQHandler
{
//u8 i;
FlagStatus Usart1IT_TCFlag;
Usart1IT_TCFlag = USART_GetITStatus(USART1, USART_IT_TC);
if(Usart1IT_TCFlag == SET)
{
//while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
//USART_ClearITPendingBit(USART1,USART_FLAG_WU );
USART_ClearITPendingBit(USART1, USART_IT_TC);
USART_ClearITPendingBit(USART1, USART_IT_TXE);
//delay(100);
//assert_param(IS_USART_ALL_PERIPH(USART1));
//assert_param(IS_USART_DATA(DATA));
//USART_RequestCmd (USART1, USART_Request_TXFRQ,ENABLE);
//USART_RequestCmd (USART1, USART_Request_RXFRQ,DISABLE);
//USART_GetITStatus (USART1, USART_IT_TXE);
// USART_SendData( USART1,0x11);
SetUsart1Tx_Status(0);
//·¢Ëííê3éÇå3y·¢Ëí×′쬱êÖ¾
}
//if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)) //ORE interrupt
//USART_ClearITPendingBit(USART1, USART_IT_ORE);
if(USART_GetITStatus(USART1,USART_IT_IDLE)!=RESET)//′®¿ú¿ÕÏD
{
//FLASH_WriteHalfWord(FlashPag127_addr, testtt1, 0x05);
//DMA_Cmd(DMA1_Channel5, DISABLE);//1رÕDMA,·àÖ1′|àíÆä¼äóDêy¾Y
USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);//¿aÆô¿ÕÏDÖD¶Ï
//USART_ReceiveData(USART1);
//delay(1);
//USART_Rxlength=Usart1_RxNumMax-DMA_GetCurrDataCounter(DMA1_Channel5);
//Usart1_Rx_bz=0x05;
//DMA_Cmd(DMA1_Channel5, ENABLE);//′ò¿aDMA,·àÖ1′|àíÆä¼äóDêy¾Y
//Usart1_Rx_bz=5;//ËμÃ÷óD¿¨·¢DÅoÅoóóD»Ø¸′Ãüáî
}
}
void DMA1_Channel2_3IRQHandler(void) //这一句单写2会报错,不知问什么
{
FlagStatus DMAIT_TCFlag;
DMAIT_TCFlag = DMA_GetITStatus(DMA1_IT_TC2);
if(DMAIT_TCFlag == SET)
{
DMA_ClearITPendingBit(DMA1_IT_TC2);
DMA_Cmd(DMA1_Channel2, DISABLE);
}
}
void Usart1_BufSend(u8 *sendbuf,u8 sendnum)
{
u8 i=0;
if(sendnum > Usart1_TxNumMax)
{
sendnum = 1;
}
while(Usart1Tx_Status);
Usart1Tx_Num = sendnum; //ìîD′·¢Ëí¸öêy
for(i=0;i<sendnum;i++)
{
Usart1_TxBuf[i] = sendbuf[i]; //½«òa·¢ËíμÄêy¾Y·Åμ½·¢Ëí»o′æ
}
Usart1Tx_Status = 1; //ÖÃλ·¢Ëí±êÖ¾
}
void Usart_SendCheck(void)
{
if(Usart1Tx_Status ==1 )
{
Usart1Tx_Status = 2;
DMAChanal2_InitConfig(Usart1TDR_Add,Usart1_TxBuf,(u32) Usart1Tx_Num);
}
}
void DMAChanal2_InitConfig(uint32_t DMA_PeriphAddrtemp,u8* DMA_MemoryAddrtemp,uint32_t DMA_BufferSizetemp)
{
DMA_InitTypeDef DMA_InitStruct;
DMA_DeInit(DMA1_Channel2);
DMA_StructInit(&DMA_InitStruct);
/*-------------- Reset DMA init structure parameters values ------------------*/
/* Initialize the DMA_PeripheralBaseAddr member */
DMA_InitStruct.DMA_PeripheralBaseAddr = DMA_PeriphAddrtemp; //é趨íaéèμØÖ·
/* Initialize the DMA_MemoryBaseAddr member */
DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)DMA_MemoryAddrtemp; //é趨Äú′æμØÖ·
/* Initialize the DMA_DIR member */
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST; // íaéè×îÎaÄ¿μÄμØÖ·DMA_DIR_PeripheralSRC;
/* Initialize the DMA_BufferSize member */
DMA_InitStruct.DMA_BufferSize = DMA_BufferSizetemp;
/* Initialize the DMA_PeripheralInc member */
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
/* Initialize the DMA_MemoryInc member */
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
/* Initialize the DMA_PeripheralDataSize member */
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
/* Initialize the DMA_MemoryDataSize member */
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
/* Initialize the DMA_Mode member */
DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
/* Initialize the DMA_Priority member */
DMA_InitStruct.DMA_Priority = DMA_Priority_Low;
/* Initialize the DMA_M2M member */
DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2,&DMA_InitStruct);
DMA_ClearFlag(DMA1_FLAG_TC2);
DMA_ClearFlag(DMA1_FLAG_GL2);
DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
// uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx)
// FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG)
// void DMA_ClearFlag(uint32_t DMAy_FLAG)
// ITStatus DMA_GetITStatus(uint32_t DMAy_IT)
DMA_Cmd(DMA1_Channel2, ENABLE);
}
|
最佳答案
查看完整内容[请看2#楼]
原因找到了,是void DMA1_Channel2_3IRQHandler(void)少写了一个_,应该为DMA1_Channel2_3_IRQHandler(void)
|