本帖最后由 天人一口12 于 2018-2-4 15:31 编辑
先说一下我的思路,为了方便看到效果,所以选择控制IO口是开发板上带的两个灯对应的IO口。PB0口对应的灯是的亮灭是我定义的数组里面的数字来决定的,而且我需要的是这个数组一直传输数据,所以把传输数组的那行代码放到了一个while(1)循环之中,但是我又需要在一定的情况下结束这个while(1)循环,所以在里面加了一个判断if语句,接了一个break,而问题就出在这里。我想要通过串口来实现while循环的结束,但是我在串口助手里面发送指令的时候,并没有实现while的结束循环,灯PB0还是一直亮灭,由于循环结束不了,所以我通过串口助手发其他的指令也没办法直接控制另一个灯PB1的状态。u32 SendBuffer[10]={0x00000,0x00000,0x00000,0x00000,0x00000,
0xFFFFF,0xFFFFF,0xFFFFF,0xFFFFF,0xFFFFF
};//y为0
void Sendxy(u32 *p,u32 s_long);
void Sendxy(u32 *p,u32 s_long)
{
u32 i,j,tempx,datax;
for(i=0;i<s_long;i++)
{
datax=*(p+i);
for(j=0;j<20;j++)
{
tempx=(datax<<j)&0x80000;
if(tempx) //传输1
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //传输1时
delay_ms(1);
} //
else //
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //传输0
delay_ms(1);
}
}
}
}
int main(void)
{
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(115200); //串口初始化
LED_Init(); //初始化LED
while(1)
{
if(USART_RX_STA&0x8000)
{
if(aRxBuffer[0]=='0')
{
USART_RX_STA=0;
while(1)
{
Sendxy(SendBuffer,10); //闪烁
if(aRxBuffer[0]=='B')
break;
// HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);//也试过用这一行代码代替break,结果是串口助手发B,灯PB1没有亮
}
}
if(aRxBuffer[0]=='1')
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
}
if(aRxBuffer[0]=='2')
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
}
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>