问题说明:
最近,正在进行通过串行端口读取压力模块压力值的项目。 所用压力模块的基本工作原理是通过串行端口向压力模块发送读取压力指令' 1:R:MRMD:0:0 ' (字符串), 压力模块收到返回压力值字符串' 1: f : mrmd 3360101.003360 KPA的压力值字符串后,需要进行拆分以提取识别位' f '、压力值' 101.00 '和压力单位' kpa '
该项目的构思是通过DMA传输方式将串行端口接收到的压力字符串从串行数据寄存器传输到存储器,通过串行端口总线空闲中断(IDLE )判断压力值字符串接收是否完成,接收完成后中断提示
但是,在keil仿真器中,由于在模拟过程中rxne状态位接收到字符串时不设置,所以空闲中断没有响应,最终压力字符串没有被有效处理。 我刚接触stm32,不知道是什么问题。 我想让前辈教我。
接下来是我的程序:
主函数:
voiddelay(_IOU32ncount )/*自定义延迟函数(/
{
for (; nCount!=0; nount----;
}
void usart _ send char (usart _ typedef * usartx,uint8_t data )/*自定义串行发送数据函数(/
{
usart_senddata(usartx,data );
while (usart _ getflagstatus (usartx,USART_FLAG_TC )==RESET );
}
输入主(语音) )。
{
char *str1;
int i=0;
USART1_Config (; /*串行端口初始化*
USART1_DMA_Config (; /*DMA初始化*
NVIC_Configuration (; /*中断优先级的设定*
while(1)。
{
str1=' 1: r : mrmd 3360033600n '; /*阅读压力指令*
usart_clearflag(usarT1,USART_FLAG_TC );
for(I=0; str1!=' '; I(/)发送导线压力指令) /
{
usart_sendchar(usart1,str1);
}
usart _ send char (usar t1,0x0d );
usart _ send char (usar t1,0x0a ); /*压力模块的规定导线压力指令以0D、0A结束*
戴尔(500000;
if ) temp1=='f ' )
布雷克;
}
while(1)。
{
}
pressure=atof (时间2;
}
串行端口和DMA配置:
#include 'bsp_usart1.h '
#include 'stm32f10x.h '
#include 'stm32f10x_conf.h '
# define usart1_ dr _ base0x 40013804
char PRESSURE[PRESSURE_LENGTH]; /*压力字符串位于内存缓冲区中,长度为512*/
Void用户1 _ config (Void ) )。
{
gpio _ inittypedefgpio _ init structure;
usart _ inittypedefusart _ init structure;
RCC _ AP B2 periphclockcmd (RCC _ AP B2 per iph _ usar t1|RCC _ AP B2 per iph _ gpioa|RCC _ AP B2 per iph _ afio,ENABLE );
gpio _ init structure.gpio _ pin=gpio _ pin _ 9;
gpio _ init structure.gpio _ mode=gpio _ mode _ af _ PP;
gpio _ init structure.gpio _ speed=gpio _ speed _ 50m Hz;
gpio_init(gpioa,GPIO_InitStructure );
gpio _ init structure.gpio _ pin=gpio _ pin _ 10;
gpio _ init structure.gpio _ mode=gpio _ mode _ in _ floating;
gpio_init(gpioa,GPIO_InitStructure );
usart _ init structure.usart _ baudrate=9600;
usart _ init structure.usart _ word lengt
h=USART_WordLength_8b;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(USART1,&USART_InitStructure);
USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
USART_ClearFlag(USART1,USART_FLAG_TC);
}
void USART1_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr=USART1_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&PRESSURE;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize =PRESSURE_LENGTH; /*传输数量为512*/
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_Init(DMA1_Channel5,&DMA_InitStructure);
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
DMA_Cmd(DMA1_Channel5,ENABLE);
}
中断程序:
void USART1_IRQHandler(void)
{
uint16_t i;
uint8_t Clear=Clear;
if(USART_GetITStatus(USART1,USART_IT_IDLE)!=RESET)
{
DMA_Cmd(DMA1_Channel5,DISABLE);
Clear=USART1->SR;
Clear=USART1->DR; /*清除标志位*/
DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel5);
for(i=0;i
{
PRESSURE_COPY1=PRESSURE;
PRESSURE_COPY2=PRESSURE;
PRESSURE_COPY3=PRESSURE; /*将压力字符串复制3份已备切割*/
}
temp1=StringCut1(PRESSURE_COPY1);
temp2=StringCut2(PRESSURE_COPY2);
temp3=StringCut3(PRESSURE_COPY3);
DMA_SetCurrDataCounter(DMA1_Channel5,PRESSURE_LENGTH);
n=DMA1_Channel5->CNDTR;
DMA_Cmd(DMA1_Channel5,ENABLE);
}
}
自定义的字符串切割函数
char* StringCut1(char string[])
{
char*temp = strtok(string,":");
temp=strtok(NULL,":");
return temp;
}
char* StringCut2(char string[])
{
char*temp = strtok(string,":");
temp=strtok(NULL,":");
temp=strtok(NULL,":");
temp=strtok(NULL,":");
return temp;
}
char* StringCut3(char string[])
{
char*temp = strtok(string,":");
temp=strtok(NULL,":");
temp=strtok(NULL,":");
temp=strtok(NULL,":");
temp=strtok(NULL,":");
return temp;
}
我来回答