OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2878|回复: 4

串口实验求解啊,下载不进去啊,led灯也没反应,战舰板

[复制链接]

31

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2016-6-5
在线时间
53 小时
发表于 2016-7-26 14:11:07 | 显示全部楼层 |阅读模式
1金钱
主函数:
#include "key.h"
#include "led.h"
#include "usart.h"
#include "sys.h"
#include "delay.h"

int main(void)
{
        u16 t, len, times=0;
       
        key_init();
        LED_init();
        delay_init();                                                                                               
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);
        while(1)
        {
                if(USART_RX_STA&0x8000)
                {
                        len=USART_RX_STA&0x3fff;
                        printf("\r\n我发送的消息为:\r\n\r\n");
                        for(t=0;t<len;t++)
                        {
                                USART_SendData(USART1,USART_RX_BUF[t]);
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        }
                        printf("\r\n\r\n");
                        USART_RX_STA=0;
                }
                else
                {
                        times++;
                        if(times%5000==0)
                        {
                                printf("\r\n战舰STM32开发板 串口实验\r\n");
                        }
                        if(times%200==0) printf("请输入数据,以回车键结束\n");
                        if(times%30==0) LED_0=!LED_0;
                        delay_ms(10);
                }
       
        }
}




led函数:
#ifndef _led_h
#define _led_h
#include "sys.h"

#define LED_0 PBout(5)                                                //使用位带操作,讲PB.5定义为LED_0;
#define LED_1 PEout(5)                                                //使用位带操作,讲PE.5定义为LED_1;

void LED_init(void);                                                        //定义初始化函数

#endif


#include "led.h"

void LED_init(void)
{
        GPIO_InitTypeDef GPIO_Initstrue;                                                                                //定义GPIO初始化结构体
       
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);                                                //使能GPIOB和GPIOE的时钟
       
        GPIO_Initstrue.GPIO_Mode=GPIO_Mode_Out_PP;                                        //通用推挽输出
        GPIO_Initstrue.GPIO_Pin=GPIO_Pin_5;                                                                        //引脚5
        GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;                                        //传输速度50M
        GPIO_Init(GPIOB,&GPIO_Initstrue);                                                                                //GPIOB初始化函数
        GPIO_SetBits(GPIOB,GPIO_Pin_5);                                                                                        //将GPIOB_5设置为高电平
       
        GPIO_Initstrue.GPIO_Pin = GPIO_Pin_5;                                                                //引脚5
        GPIO_Init(GPIOE,&GPIO_Initstrue);                                                                                //GPIOE初始化函数
        GPIO_SetBits(GPIOE,GPIO_Pin_5);                                                                                        //将GPIOE_5设置为高电平
}


按键函数:

#ifndef _key_init
#define _key_init
#include "sys.h"

#define key2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define key1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define key0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define wk_up GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)

void key_init(void);
u8 key_scan(u8);

#endif




#include "key.h"
#include "delay.h"
#include "sys.h"
#include "stm32f10x.h"

void key_init(void)
{
        GPIO_InitTypeDef GPIO_Initstrue;                                                //定义初始化结构体变量
       
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE);                                                //使能GPIOA,GPIOE的时钟
       
        GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IPU;                                                                                                //带上拉输入
        GPIO_Initstrue.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;                        //脚2,3,4
        //GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;                                                                                //传输速度50M
        GPIO_Init(GPIOE,&GPIO_Initstrue);                                                                                                                        //初始化函数

        GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IPD;                                                                                                //带下拉输入
        GPIO_Initstrue.GPIO_Pin=GPIO_Pin_0;                                                                                                                //脚0
        GPIO_Init(GPIOA,&GPIO_Initstrue);                                                                                                                        //初始化函数
}

u8 key_scan(u8 mode)
{
        static u8 key_up = 1;                                //定义按键静态变量
       
        if(mode)                                                                                //模式1为支持连续按键,模式0为不支持连续按键
        {
                key_up=1;
        }                                                                                                                                                                                                                                        //模式0时,第一次key_up为1,判断按键按下,当按键按下不松开时,第二次进入时,key_up为0,直到
                                                                                                                                                                                                                                                //松开按键,进入else if将按键标志位复原为1,才能进行下一次按键判断。即为不能进行连续按键
        if(key_up&&(key2==0||key1==0||key0==0||wk_up==1))                                        //模式1式时,key_up始终为1,当按键按下时,相应的4个按键电位发生变化,通过检测相应电位的变化
        {                                                                                                                                                                                                                                        //来判断是哪个按键按下,并返回相应的数值
                delay_ms(10);                                                                                                                                                                                //延时10ms,这段时间是用来消除按键抖动的时间,按键抖动一般是5-10ms,设置为10ms,太长浪费程序时间
                key_up=0;                                                                                                                                                                                                //按键按下标志位
                if(key2==0) return 3;                                                                                                                                                //返回相应的按键值
                else if(key1==0) return 2;
                else if(key0==0) return 1;
                else if(wk_up==1) return 4;               
        }
        else if(key2==1&&key1==1&&key0==1&&wk_up==0) key_up = 1;        //如果没按键按下,按键标志位复原
        return 0;
}





最佳答案

查看完整内容[请看2#楼]

我发现是我初始化函数调用错误,调用 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE); 时错误的,应该调用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2016-6-5
在线时间
53 小时
 楼主| 发表于 2016-7-26 14:11:08 | 显示全部楼层
feichan61 发表于 2016-7-26 18:22
你是使用了外部自接的led灯吗?  否则战舰板上的led灯的io口你定义似乎有点问题

我发现是我初始化函数调用错误,调用 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE); 时错误的,应该调用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE);
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-7-20
在线时间
6 小时
发表于 2016-7-26 18:20:46 | 显示全部楼层
GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IPU;                                                                                                //带上拉输入
        GPIO_Initstrue.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;                        //脚2,3,4
        //GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;                                                                                //传输速度50M
        GPIO_Init(GPIOE,&GPIO_Initstrue);                                                                                                                        //初始化函数

        GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IPD;                                                                                                //带下拉输入
        GPIO_Initstrue.GPIO_Pin=GPIO_Pin_0;                                                                                                                //脚0
        GPIO_Init(GPIOA,&GPIO_Initstrue);         
你这句话什么意思?你的io定义了两次?
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-7-20
在线时间
6 小时
发表于 2016-7-26 18:22:22 | 显示全部楼层
你是使用了外部自接的led灯吗?  否则战舰板上的led灯的io口你定义似乎有点问题
回复

使用道具 举报

31

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2016-6-5
在线时间
53 小时
 楼主| 发表于 2016-7-26 22:14:21 | 显示全部楼层
feichan61 发表于 2016-7-26 18:20
GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IPU;                                                              ...

两个GPIO口,一个A口,一个E口
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-2 11:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表