初级会员

- 积分
- 56
- 金钱
- 56
- 注册时间
- 2018-3-13
- 在线时间
- 41 小时
|
10金钱
stm32f103ze的板子主函数:
int main(void)
{
u8 SEND_BUF[256]= {0};
RS485_Init(115200);
Led_Init();
delay_init();
LED1 = 1;
LED0 = 1;
RS485_TX_EN = 1;
MYDMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)SEND_BUF,256);//DMA1通道7,外设为串口2,存储器为SEND_BUF,长256.
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
while(1)
{
USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE); //使能串口2的DMA发送
MYDMA_Enable(DMA1_Channel7);//开始一次DMA传输!
delay_ms(1500);
}
}
DMA配置,基本是原子的程序:
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
DMA_InitTypeDef DMA_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
DMA1_MEM_LEN=cndtr;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
DMA_InitStruct.DMA_BufferSize=cndtr;//每次传输的数据量,大于1小于65535,即0x10000.
DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST;////数据传输方向,从内存读取发送到外设,外设作为数据传输的目的地
DMA_InitStruct.DMA_M2M=DMA_M2M_Disable;
DMA_InitStruct.DMA_MemoryBaseAddr=cmar;
DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;
DMA_InitStruct.DMA_PeripheralBaseAddr=cpar;
DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_InitStruct.DMA_Priority=DMA_Priority_VeryHigh;
DMA_Init(DMA_CHx, &DMA_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel=DMA1_Channel7_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
DMA_ITConfig(DMA1_Channel7,DMA1_IT_TC7,ENABLE);
}
//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_Cmd(DMA_CHx, DISABLE ); //关闭USART1 TX DMA1 所指示的通道
DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);//DMA通道的DMA缓存的大小
DMA_Cmd(DMA_CHx, ENABLE); //使能USART1 TX DMA1 所指示的通道
}
//void DMA1_Channel7_IRQHandler(void)
//{
// if(DMA_GetITStatus(DMA1_IT_TC7)!=RESET)
// {
// LED0=~LED0;
// }
// DMA_ClearITPendingBit(DMA1_IT_TC7);
//}
void DMA1_Channel7_IRQHandler(void)
{
if((DMA1->ISR)&(1<<25)) //判断传输完成中断位是否置位
{
LED1=0;
}
DMA1->IFCR|=1<<25; //清除完成传输中断
}
.S文件的中断的名称
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
每隔1.5s,串口2发送一次数据,数据能用串口收到,就是进不到中断,反转LED电平
|
|