stm32 串口接收字符串 中断程序怎么写

stm32 串口接收字符串 中断程序怎么写,第1张

void USART3_IRQHandler(void)

{

u8 res;

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//½ÓÊÕµ½Êý¾Ý

{

res =USART_ReceiveData(USART3);

if((USART3_RX_STA&(1<<15))==0)//½ÓÊÕÍêµÄÒ»ÅúÊý¾Ý,»¹Ã»Óб»´¦Àí,Ôò²»ÔÙ½ÓÊÕÆäËûÊý¾Ý

{

if(USART3_RX_STA<USART3_MAX_RECV_LEN) //»¹¿ÉÒÔ½ÓÊÕÊý¾Ý

{

TIM_SetCounter(TIM7,0);//¼ÆÊýÆ÷Çå¿Õ //¼ÆÊýÆ÷Çå¿Õ

if(USART3_RX_STA==0) //ʹÄܶ¨Ê±Æ÷7µÄÖжÏ

{

TIM_Cmd(TIM7,ENABLE);//ʹÄܶ¨Ê±Æ÷7

}

USART3_RX_BUF[USART3_RX_STA++]=res; //¼Ç¼½ÓÊÕµ½µÄÖµ

}else

{

USART3_RX_STA|=1<<15; //Ç¿ÖÆ±ê¼Ç½ÓÊÕÍê³É

}

}

}

}

用两个定时器分别对两个LED灯闪烁,KEY1和KEY2要设置为外部中断输入,当进入中断时KEY1_DANG或KEY2_DANG指向下一个档位,并且发送串口。给你提供点思路。

void main()

{

while(1)

{

if(key1_dang==0x01)

中断定时1设置为02秒

if(key1_dang==0x02)

中断定时1设置为04秒

if(key1_dang==0x03)

中断定时1设置为06秒

if(key1_dang==0x04)

中断定时1设置为08秒

if(key1_dang==0x05)

中断定时1设置为10秒

if(key2_dang==0x01)

中断定时2设置为02秒

if(key2_dang==0x02)

中断定时2设置为04秒

if(key2_dang==0x03)

中断定时2设置为06秒

if(key2_dang==0x04)

中断定时2设置为08秒

if(key2_dang==0x05)

中断定时2设置为10秒

}

}

我是用的原子的寄存器版的,

串口部分初始化部分加入这个

USART1->CR3=1<<7; //使能串口1的DMA发送

这是初始化

MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)TData,32);//DMA1通道4,外设为串口1,存储器为SendBuff,长度32

下面是DMAC文件里的配置

u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度

//DMA1的各通道配置

//这里的传输形式是固定的,这点要根据不同的情况来修改

//从存储器->外设模式/8位数据宽度/存储器增量模式

//DMA_CHx:DMA通道CHx

//cpar:外设地址

//cmar:存储器地址

//cndtr:数据传输量

void MYDMA_Config(DMA_Channel_TypeDefDMA_CHx,u32 cpar,u32 cmar,u16 cndtr)

{

u32 DR_Base; //做缓冲用,不知道为什么非要不可

RCC->AHBENR|=1<<0;//开启DMA1时钟

DR_Base=cpar;

DMA_CHx->CPAR=DR_Base; //DMA1 外设地址

DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址

DMA1_MEM_LEN=cndtr; //保存DMA传输数据量

DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量

DMA_CHx->CCR=0X00000000;//复位

DMA_CHx->CCR|=1<<1; //TCIE:允许传输完成中断

DMA_CHx->CCR|=1<<4; //从存储器读

DMA_CHx->CCR|=0<<5; //普通模式

DMA_CHx->CCR|=0<<6; //外设地址非增量模式

DMA_CHx->CCR|=1<<7; //存储器增量模式

DMA_CHx->CCR|=0<<8; //外设数据宽度为8位

DMA_CHx->CCR|=0<<10; //存储器数据宽度8位

DMA_CHx->CCR|=1<<12; //中等优先级

DMA_CHx->CCR|=0<<14; //非存储器到存储器模式

MY_NVIC_Init(2,1,DMA1_Channel4_IRQChannel,3); //抢占优先级3,响应优先级0,组3

}

//开启一次DMA传输

void MYDMA_Enable(DMA_Channel_TypeDefDMA_CHx)

{

DMA_CHx->CCR&=~(1<<0); //关闭DMA传输

DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,传输数据量

DMA_CHx->CCR|=1<<0; //开启DMA传输

}

void DMAChannel4_IRQHandler(void)

{

if (DMA1->ISR & (1<<13)) {

DMA1->IFCR|=1<<13;//清除通道4传输完成标志

}

}

然后每次使用调用一次这个

MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输

就可以了

以上就是关于stm32 串口接收字符串 中断程序怎么写全部的内容,包括:stm32 串口接收字符串 中断程序怎么写、利用stm32的单片机完成下面的要求,程序该怎么写,用C语言、STM32的usart的DMA方式发送 一个数 ,程序怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10041552.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存