新手上路
- 积分
- 29
- 金钱
- 29
- 注册时间
- 2022-1-2
- 在线时间
- 8 小时
|
1金钱
main.c程序如下,我在PB0处连接了灯泡,希望达到的效果是键盘处输入一个数字来控制灯泡的发亮时间,并且电脑端收到一模一样的数字。
但是导入芯片跑起来,打开xcom串口助手之后的实验现象是
①不管发送过去的是三位四位,但串口收回的数字只有前两位,且两位之间间隔一段时间
eg:发送0000 ,现象:(串口显示0,同时灯泡亮)→(延迟一下)→(串口显示00)(灯泡灭)。
②无论我输入数字多少,灯泡每次发亮时间都差不多一样长,将近1秒。
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
void My_USART1_Init(){
GPIO_InitTypeDef GPIO_Initstruct;
USART_InitTypeDef USART_Initstruct;
NVIC_InitTypeDef NVIC_InitStruct;
//step1使能gpio时钟,使能usart时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//step2 gpio初始化
//根据中文参考手册P110,将PA9,PA10设为复用推挽与浮空输入
GPIO_Initstruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Initstruct.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOA,&GPIO_Initstruct);
GPIO_Initstruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Initstruct.GPIO_Pin=GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_Initstruct);
//step3 usart初始化
USART_Initstruct.USART_BaudRate=115200;
USART_Initstruct.USART_WordLength=USART_WordLength_8b;
USART_Initstruct.USART_StopBits=USART_StopBits_1;
USART_Initstruct.USART_Parity=USART_Parity_No;
USART_Initstruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //可以同时使能两个功能:收与发
USART_Initstruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_Initstruct);
//step4 使能USART_cmd串口服务函数
USART_Cmd(USART1,ENABLE);
//step5 使能:串口来数据中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//配置这一中断
//NVIC:Nested vectored interrupt controller
//IRQ:interrupt quest中断请求
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//抢断优先级:level-2
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//抢断子优先级,随意设置的1
NVIC_Init(&NVIC_InitStruct);
}
int main(void)
{
LED_Init();
My_USART1_Init();
delay_init();
GPIO_SetBits(GPIOB,GPIO_Pin_0);
delay_ms(500);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
while(1);
}
void USART1_IRQHandler(void)//中断服务函数
{
u8 Res;
int time;
if(USART_GetITStatus(USART1, USART_IT_RXNE))
{
Res=USART_ReceiveData(USART1);
USART_SendData(USART1,Res);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
time = 1000*Res;
delay_ms(time);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}
}
求助,求助,如何达到我想要的实验效果!!
|
最佳答案
查看完整内容[请看2#楼]
因为串口助手发送的数据一般好像是ASC码,而你这里的res一次只能收8位,所以你可以弄一个数组能够把你在电脑那边发送的数据全部接收完 ,然后再发送。
你可以改成这样试试
u8 sta [10]
if(USART_GetITStatus(USART1, USART_IT_RXNE)!=Reset)
{
Res=USART_ReceiveData(USART1);
sta=res;
USART_clear_flag(USART1, USART_IT_RXNE);//我也忘了那个清中断函数啥样,你找找}
i++;if(i>=10)i=0; USART_SendData(USART ...
|