打印

用STM32开发项目所遇问题以及解决方式(持续更新中)

[复制链接]
8048|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 the_ether 于 2013-3-10 16:25 编辑

先献上原理图以及PCB一份。 光立方控制卡1.0.pdf (1.05 MB) 问题一、能够使用串口下载程序、用JLINK采用SW或者JTAG下载也行,但是为什么程序不能正常运行,比如控制PB5输出高电平,而实际用万用表测得的数据位0.6~1.3V左右?
答案:

HSE外部高速时钟的起震容值选择有错,后来用了22PF的,而且我的两片电容不是紧靠晶振,下次得注意,系统就可以正常运行,输出高就是高,输出低就是低。
问题二、为什么我没有初始系统时钟,配置的管脚依然有输出,高低且能控制。
答案:我猜测了一下,应该是STM32中文参考手册中的这句话:

问题三、蜂鸣器到底是怎样的接口电路才正确
答案:我还没有查相关资料,但是我硬件实验出来的结果如下:

这样,蜂鸣器是不能正常工作的,后来,我把三极管去掉,把1K电阻也去掉,220欧电阻也去掉,直接弄成

我就能正常控制蜂鸣器了,虽然不知道为什么,但是功能达到了,望各位大哥解释一下。
问题四、难道是程序编得太复杂了,都不正常工作了?
附两段配置IO的程序,第一段中的出来BUZZER的管脚都能正常控制,BUZZER就不行,只能将配置BUZZER的程序放到主函数中,它就能被正常控制
void LED_Init(void)
{
        RCC->APB2ENR|=1<<3;    //ʹÄÜPORTBʱÖÓ                    
        RCC->APB2ENR|=1<<4;    //ʹÄÜPORTCʱÖÓ
        RCC->APB2ENR|=1<<5;    //ʹÄÜPORTCʱÖÓ
//ÐпØÖƶ˿ÚÅäÖà                          
        GPIOB->CRL&=0XFF0FFFFF;
        GPIOB->CRL|=0X00300000;//PB5 ÍÆÍìÊä³ö            
    GPIOB->ODR|=1<<5;      //PB5 ¾²Ö¹Ê¹ÄÜ£¨Êä³ö¸ß£©
        GPIOB->CRL&=0X0FFFFFFF;
        GPIOB->CRL|=0X30000000;//PB7 ÍÆÍìÊä³ö            
        GPIOB->CRL&=0XF0FFFFFF;
        GPIOB->CRL|=0X03000000;//PB6 ÍÆÍìÊä³ö            
        GPIOC->CRL&=0XFFFFFFF0;
//0ÇøÊý¾ÝÊäÈë¶Ë¿ÚÅäÖÃ
        GPIOC->CRL|=0X00000003;//PC0 ÍÆÍìÊä³ö
        GPIOC->CRL&=0XFFFFFF0F;
        GPIOC->CRL|=0X00000030;//PC1 ÍÆÍìÊä³ö
        GPIOC->CRL&=0XFFFFF0FF;
        GPIOC->CRL|=0X00000200;//PC2 ÍÆÍìÊä³ö
        GPIOC->CRL&=0XFFFF0FFF;
        GPIOC->CRL|=0X00003000;//PC3 ÍÆÍìÊä³ö
        GPIOC->CRL&=0XFFF0FFFF;
        GPIOC->CRL|=0X00030000;//PC4 ÍÆÍìÊä³ö
        GPIOC->CRL&=0XFF0FFFFF;
        GPIOC->CRL|=0X00300000;//PC5 ÍÆÍìÊä³ö
        GPIOC->CRL&=0XF0FFFFFF;
        GPIOC->CRL|=0X03000000;//PC6 ÍÆÍìÊä³ö
        GPIOC->CRL&=0X0FFFFFFF;
        GPIOC->CRL|=0X30000000;//PC7 ÍÆÍìÊä³ö
        GPIOB->CRH&=0XFFFFFFF0;
//1ÇøÊý¾ÝÊäÈë¶Ë¿ÚÅäÖÃ
        GPIOB->CRH|=0X00000003;//PB8  ÍÆÍìÊä³ö
        GPIOB->CRH&=0XFFFFFF0F;
        GPIOB->CRH|=0X00000030;//PB9  ÍÆÍìÊä³ö
        GPIOB->CRH&=0XFFFFF0FF;
        GPIOB->CRH|=0X00000300;//PB10  ÍÆÍìÊä³ö
        GPIOB->CRH&=0XFFFF0FFF;
        GPIOB->CRH|=0X00003000;//PB11  ÍÆÍìÊä³ö
        GPIOB->CRH&=0XFFF0FFFF;
        GPIOB->CRH|=0X00030000;//PB12  ÍÆÍìÊä³ö
        GPIOB->CRH&=0XFF0FFFFF;
        GPIOB->CRH|=0X00300000;//PB13  ÍÆÍìÊä³ö
        GPIOB->CRH&=0XF0FFFFFF;
        GPIOB->CRH|=0X03000000;//PB14  ÍÆÍìÊä³ö
        GPIOB->CRH&=0X0FFFFFFF;
        GPIOB->CRH|=0X30000000;//PB15  ÍÆÍìÊä³ö
//²ã¿ØÖƶ˿ÚÅäÖÃ
        GPIOC->CRH&=0XFFFFFFF0;
        GPIOC->CRH|=0X00000003;//PC8   ÍÆÍìÊä³ö
        GPIOC->CRH&=0XFFFFFF0F;
        GPIOC->CRH|=0X00000030;//PC9   ÍÆÍìÊä³ö
        GPIOC->CRH&=0XFFFFF0FF;
        GPIOC->CRH|=0X00000300;//PC10   ÍÆÍìÊä³ö
        GPIOC->CRH&=0XFF0FfFFF;
        GPIOC->CRH|=0X00300000;//PC13   ÍÆÍìÊä³ö
//ÅäÖÃBUZZER¶Ë¿Ú
        GPIOD->CRL&=0XFFFFF0FF;
        GPIOD->CRL|=0X00000300;
    GPIOD->ODR|=1<<2;      //PD2Êä³ö¸ß
}
第二段程序,是我精简的程序,不用将BUZZER配置端口的程序放主函数,也能全部正常运行。
void LED_Init(void)
{
        RCC->APB2ENR|=1<<3;//ʹÄÜPORTBʱÖÓ
        RCC->APB2ENR|=1<<4;//ʹÄÜPORTCʱÖÓ
        RCC->APB2ENR|=1<<5;//ʹÄÜPORTDʱÖÓ
//ÅäÖÃPB5~PB15ΪÍÆÍìÊä³ö
        GPIOB->CRH&=0X00000000;
        GPIOB->CRH|=0X33333333;
        GPIOB->CRL&=0X000FFFFF;
        GPIOB->CRL|=0X33300000;
//ÅäÖÃPC0~PC11ΪÍÆÍìÊä³ö
        GPIOC->CRH&=0XFFFF0000;
        GPIOC->CRH|=0X00003333;
        GPIOC->CRL&=0X00000000;
        GPIOC->CRL|=0X33333333;
//ÅäÖÃPD2ΪÍÆÍìÊä³ö
        GPIOD->CRL&=0XFFFFF0FF;
        GPIOD->CRL|=0X00000300;
        GPIOD->ODR|=1<<2;
}
问题5:电平不一样导致程序不能正常运行。我的595、138、245的控制信号都是3.3这个电平的,结果这些芯片的VCC和GND都是给的5V电压。。后来我换成3.3V的,问题就解决了。看来没有仔细看数据手册呀。问题6:用STM32实现单字节的发送和接收程序
具体描述:现在我有一上位机可以发送64个字节的数据,在单片机上设定了一个全局变量:u8 USART_RX_BUF[64];     //接收缓冲,最大64个字节,希望通过上位机发送64个字节后,存储在USART_RX_BUF[64],但现在,只能实现单片机的发,收程序一直不行,请指教。附中断程序:
#ifdef EN_USART1_RX           
u8 USART_RX_BUF[64];     
u8 USART_RX_STA=0;                
void USART1_IRQHandler(void)
{
        u8 res;            
        if(USART1->SR&(1<<5))
        {         
                res=USART1->DR;
                USART_RX_BUF[USART_RX_STA]=res;
                USART_RX_STA++;
                if(USART_RX_STA>63)
                        USART_RX_STA=0;                                                                       
        }                                                                                           
}
#endif




沙发
zhaoyu2005| | 2013-3-9 09:33 | 只看该作者
硬件基础太差了,建议重修,连硬件的问题都没解决完就,就进行寄存器的直接操作,那你不是自找苦吃么?

使用特权

评论回复
板凳
明月小厨| | 2013-3-9 11:58 | 只看该作者

在BUZZER端口处于OD模式时,符合你的测试结果;

使用特权

评论回复
地板
明月小厨| | 2013-3-9 12:12 | 只看该作者
我强烈建议你找一本STM32的书看看;多收集几本;要求:
1.例说STM32;这本是正点原子的开发板配套,书和板配合的很好;但是,并不适合新手上路;因为基于寄存器模式的操作,需要你对寄存器的操作非常清楚,需要了解细节;这本可以配,但入手用它很累;
2.STM32自学笔记;这本书也不错,但是它的库是V2.X版本;幸好V2.X和V3.X差别并不太大;RCC部分好象有差别的;
3.STM32F ARM微控制器应用设计与实践(北航出版社),黄智伟,王兵,朱卫华编著;这本书的库是V3.X;
4.......快速上手等等;
论坛里有相关的书目;(好象是在ST自己的论坛里);

使用特权

评论回复
5
明月小厨| | 2013-3-9 12:19 | 只看该作者
一旦你习惯了用库,就会有一种面向对象编程的感觉;不需要看很深入的寄存器说明,不需要去探入理解每一个BIT的含义及相互关系;
一个结构定义;一个结构变量;然后模板式的初始化它们;然后初始化;这样外设就可以用起来了;
海量的视频教程;
在实时性要求很高的地方,你用寄存器操作,提高效率;其它地方用库解决;:)
很快你就上路了;上路后把应该做的做好了;回头再看数据手册,参考手册去优化一下你想在意的地方;

例:外设部分的时钟使能;
用操作寄存器的模式,一次性解决;IO端口的设置;用寄存器模式直接处理;(必要性并不大,还容易出错)

使用特权

评论回复
6
明月小厨| | 2013-3-9 12:30 | 只看该作者
我一开始搞STM32的时候,用的就是正点原子的开发板和书;一个上电后的启动,我就搞的很深入,很精,也很费时间;这部分搞完后,整天在论坛里泡着;才发现很多人是用库;
用库编程?运行的效率肯定是不行的,再说我也不会用库;用寄存器没有门槛,只要时间耗的起肯定也是一点点进步;直到RCC部分我重新用库来解决,发现似乎非常简单;代码长度是有些吓人;

我决定用库编程是因为我看了一个视频,初始化串口;
直接一句 波特率 = 115200;太神奇了,我立即就傻掉了,要知道用寄存器操作的时候这个要精确计算过的,
现在不用了,库自己很聪明,它会帮你计算;
后面还有几句大白话:如
数据位是几位:答8位;
停止位是几位:答1位;
校验否?否
......
编程变成了填空;细节不需要关注它;一堆的寄存器定义也不用理它了;

后来我发现,所有的外设初始化都是这样完成的;

使用特权

评论回复
7
the_ether|  楼主 | 2013-3-9 12:35 | 只看该作者
明月小厨 发表于 2013-3-9 11:58
在BUZZER端口处于OD模式时,符合你的测试结果;

我的BUZZER端口处于推挽输出模式,可以达到要求

使用特权

评论回复
8
明月小厨| | 2013-3-9 12:50 | 只看该作者
现在更新换代的速度很快;前些年还大力推广的LM的很多器件已经下架了;
STM32F10X也是面世有些年头了,目前还是主力;现在F2,F3,F4都一个个冒出来了,还有F0功能性能也差不多,价格却只有F10x的一半;

使用特权

评论回复
9
明月小厨| | 2013-3-9 12:53 | 只看该作者
the_ether 发表于 2013-3-9 12:35
我的BUZZER端口处于推挽输出模式,可以达到要求

推拉输出,怎么三极管都驱动不了呢?
PNP的三极管如果接电源正,OC模式是可以的;
能OC的时候,不要用PP;

使用特权

评论回复
10
明月小厨| | 2013-3-9 12:54 | 只看该作者
真晕,你还接1K的电阻;轰鸣器内阻有多少?分压后还有多大的声音?

使用特权

评论回复
11
the_ether|  楼主 | 2013-3-9 14:14 | 只看该作者
明月小厨 发表于 2013-3-9 12:54
真晕,你还接1K的电阻;轰鸣器内阻有多少?分压后还有多大的声音?

我现在就是正极接VCC,负极直接接的IO管脚,现在测试表明推挽输出模式可以驱动

使用特权

评论回复
12
明月小厨| | 2013-3-9 16:31 | 只看该作者
你胆子够大;直接驱动;

使用特权

评论回复
13
the_ether|  楼主 | 2013-3-9 17:01 | 只看该作者
明月小厨 发表于 2013-3-9 16:31
你胆子够大;直接驱动;

我真心没搞懂是咋回事,现在是直接驱动,没有任何问题,如果一旦用三极管的话,BEEP两管脚的电压只会在2V左右

使用特权

评论回复
14
laoxu| | 2013-3-9 17:46 | 只看该作者
the_ether 发表于 2013-3-9 17:01
我真心没搞懂是咋回事,现在是直接驱动,没有任何问题,如果一旦用三极管的话,BEEP两管脚的电压只会在2V ...

短接你的1K电阻,将220欧改成1K-10K。

使用特权

评论回复
15
dirtwillfly| | 2013-3-9 18:54 | 只看该作者
谢谢楼主的分享,学习了

使用特权

评论回复
16
cjhk| | 2013-3-9 21:08 | 只看该作者
学习一下  这个帖子不错哦  呵呵  顶一个  需要好好理一理  这段时间一直在搞这一块  很多知识点  个人认为不是吃的恨透  需要不断学习  呵呵   顶一个

使用特权

评论回复
17
sxhhhjicbb| | 2013-3-9 21:56 | 只看该作者
蜂鸣器那个电源要5V。

使用特权

评论回复
18
huangfeng33| | 2013-3-9 22:05 | 只看该作者
直接驱动,搞不好会报废的,那是硬伤啊 ……

使用特权

评论回复
19
the_ether|  楼主 | 2013-3-9 22:15 | 只看该作者
huangfeng33 发表于 2013-3-9 22:05
直接驱动,搞不好会报废的,那是硬伤啊 ……

真的没有报废啊。。。你是说STM32报废还是蜂鸣器报废。。我用了两天了。没有任何问题。

使用特权

评论回复
20
the_ether|  楼主 | 2013-3-9 22:15 | 只看该作者
sxhhhjicbb 发表于 2013-3-9 21:56
蜂鸣器那个电源要5V。

我用的3.3V。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:书到用时方恨少,事非经过不知难。

13

主题

95

帖子

0

粉丝