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

[复制链接]
8872|23
 楼主| the_ether 发表于 2013-3-8 22:32 | 显示全部楼层 |阅读模式
本帖最后由 the_ether 于 2013-3-10 16:25 编辑

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

HSE外部高速时钟的起震容值选择有错,后来用了22PF的,而且我的两片电容不是紧靠晶振,下次得注意,系统就可以正常运行,输出高就是高,输出低就是低。
问题二、为什么我没有初始系统时钟,配置的管脚依然有输出,高低且能控制。
答案:我猜测了一下,应该是STM32中文参考手册中的这句话:
不初始化系统时钟能正常运行程序吗.png
问题三、蜂鸣器到底是怎样的接口电路才正确
答案:我还没有查相关资料,但是我硬件实验出来的结果如下:
蜂鸣器电路正确?.png
这样,蜂鸣器是不能正常工作的,后来,我把三极管去掉,把1K电阻也去掉,220欧电阻也去掉,直接弄成
蜂鸣器电路实验正确.png
我就能正常控制蜂鸣器了,虽然不知道为什么,但是功能达到了,望各位大哥解释一下。
问题四、难道是程序编得太复杂了,都不正常工作了?
附两段配置IO的程序,第一段中的出来BUZZER的管脚都能正常控制,BUZZER就不行,只能将配置BUZZER的程序放到主函数中,它就能被正常控制
  1. void LED_Init(void)
  2. {
  3.         RCC->APB2ENR|=1<<3;    //ʹÄÜPORTBʱÖÓ                    
  4.         RCC->APB2ENR|=1<<4;    //ʹÄÜPORTCʱÖÓ
  5.         RCC->APB2ENR|=1<<5;    //ʹÄÜPORTCʱÖÓ
  6. //ÐпØÖƶ˿ÚÅäÖà                          
  7.         GPIOB->CRL&=0XFF0FFFFF;
  8.         GPIOB->CRL|=0X00300000;//PB5 ÍÆÍìÊä³ö            
  9.     GPIOB->ODR|=1<<5;      //PB5 ¾²Ö¹Ê¹ÄÜ£¨Êä³ö¸ß£©
  10.         GPIOB->CRL&=0X0FFFFFFF;
  11.         GPIOB->CRL|=0X30000000;//PB7 ÍÆÍìÊä³ö            
  12.         GPIOB->CRL&=0XF0FFFFFF;
  13.         GPIOB->CRL|=0X03000000;//PB6 ÍÆÍìÊä³ö            
  14.         GPIOC->CRL&=0XFFFFFFF0;
  15. //0ÇøÊý¾ÝÊäÈë¶Ë¿ÚÅäÖÃ
  16.         GPIOC->CRL|=0X00000003;//PC0 ÍÆÍìÊä³ö
  17.         GPIOC->CRL&=0XFFFFFF0F;
  18.         GPIOC->CRL|=0X00000030;//PC1 ÍÆÍìÊä³ö
  19.         GPIOC->CRL&=0XFFFFF0FF;
  20.         GPIOC->CRL|=0X00000200;//PC2 ÍÆÍìÊä³ö
  21.         GPIOC->CRL&=0XFFFF0FFF;
  22.         GPIOC->CRL|=0X00003000;//PC3 ÍÆÍìÊä³ö
  23.         GPIOC->CRL&=0XFFF0FFFF;
  24.         GPIOC->CRL|=0X00030000;//PC4 ÍÆÍìÊä³ö
  25.         GPIOC->CRL&=0XFF0FFFFF;
  26.         GPIOC->CRL|=0X00300000;//PC5 ÍÆÍìÊä³ö
  27.         GPIOC->CRL&=0XF0FFFFFF;
  28.         GPIOC->CRL|=0X03000000;//PC6 ÍÆÍìÊä³ö
  29.         GPIOC->CRL&=0X0FFFFFFF;
  30.         GPIOC->CRL|=0X30000000;//PC7 ÍÆÍìÊä³ö
  31.         GPIOB->CRH&=0XFFFFFFF0;
  32. //1ÇøÊý¾ÝÊäÈë¶Ë¿ÚÅäÖÃ
  33.         GPIOB->CRH|=0X00000003;//PB8  ÍÆÍìÊä³ö
  34.         GPIOB->CRH&=0XFFFFFF0F;
  35.         GPIOB->CRH|=0X00000030;//PB9  ÍÆÍìÊä³ö
  36.         GPIOB->CRH&=0XFFFFF0FF;
  37.         GPIOB->CRH|=0X00000300;//PB10  ÍÆÍìÊä³ö
  38.         GPIOB->CRH&=0XFFFF0FFF;
  39.         GPIOB->CRH|=0X00003000;//PB11  ÍÆÍìÊä³ö
  40.         GPIOB->CRH&=0XFFF0FFFF;
  41.         GPIOB->CRH|=0X00030000;//PB12  ÍÆÍìÊä³ö
  42.         GPIOB->CRH&=0XFF0FFFFF;
  43.         GPIOB->CRH|=0X00300000;//PB13  ÍÆÍìÊä³ö
  44.         GPIOB->CRH&=0XF0FFFFFF;
  45.         GPIOB->CRH|=0X03000000;//PB14  ÍÆÍìÊä³ö
  46.         GPIOB->CRH&=0X0FFFFFFF;
  47.         GPIOB->CRH|=0X30000000;//PB15  ÍÆÍìÊä³ö
  48. //²ã¿ØÖƶ˿ÚÅäÖÃ
  49.         GPIOC->CRH&=0XFFFFFFF0;
  50.         GPIOC->CRH|=0X00000003;//PC8   ÍÆÍìÊä³ö
  51.         GPIOC->CRH&=0XFFFFFF0F;
  52.         GPIOC->CRH|=0X00000030;//PC9   ÍÆÍìÊä³ö
  53.         GPIOC->CRH&=0XFFFFF0FF;
  54.         GPIOC->CRH|=0X00000300;//PC10   ÍÆÍìÊä³ö
  55.         GPIOC->CRH&=0XFF0FfFFF;
  56.         GPIOC->CRH|=0X00300000;//PC13   ÍÆÍìÊä³ö
  57. //ÅäÖÃBUZZER¶Ë¿Ú
  58.         GPIOD->CRL&=0XFFFFF0FF;
  59.         GPIOD->CRL|=0X00000300;
  60.     GPIOD->ODR|=1<<2;      //PD2Êä³ö¸ß
  61. }
第二段程序,是我精简的程序,不用将BUZZER配置端口的程序放主函数,也能全部正常运行。
  1. void LED_Init(void)
  2. {
  3.         RCC->APB2ENR|=1<<3;//ʹÄÜPORTBʱÖÓ
  4.         RCC->APB2ENR|=1<<4;//ʹÄÜPORTCʱÖÓ
  5.         RCC->APB2ENR|=1<<5;//ʹÄÜPORTDʱÖÓ
  6. //ÅäÖÃPB5~PB15ÎªÍÆÍìÊä³ö
  7.         GPIOB->CRH&=0X00000000;
  8.         GPIOB->CRH|=0X33333333;
  9.         GPIOB->CRL&=0X000FFFFF;
  10.         GPIOB->CRL|=0X33300000;
  11. //ÅäÖÃPC0~PC11ÎªÍÆÍìÊä³ö
  12.         GPIOC->CRH&=0XFFFF0000;
  13.         GPIOC->CRH|=0X00003333;
  14.         GPIOC->CRL&=0X00000000;
  15.         GPIOC->CRL|=0X33333333;
  16. //ÅäÖÃPD2ÎªÍÆÍìÊä³ö
  17.         GPIOD->CRL&=0XFFFFF0FF;
  18.         GPIOD->CRL|=0X00000300;
  19.         GPIOD->ODR|=1<<2;
  20. }
问题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],但现在,只能实现单片机的发,收程序一直不行,请指教。附中断程序:
  1. #ifdef EN_USART1_RX          
  2. u8 USART_RX_BUF[64];     
  3. u8 USART_RX_STA=0;                
  4. void USART1_IRQHandler(void)
  5. {
  6.         u8 res;            
  7.         if(USART1->SR&(1<<5))
  8.         {         
  9.                 res=USART1->DR;
  10.                 USART_RX_BUF[USART_RX_STA]=res;
  11.                 USART_RX_STA++;
  12.                 if(USART_RX_STA>63)
  13.                         USART_RX_STA=0;                                                                       
  14.         }                                                                                           
  15. }
  16. #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自己的论坛里);

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

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

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

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

后来我发现,所有的外设初始化都是这样完成的;
 楼主| the_ether 发表于 2013-3-9 12:35 | 显示全部楼层
明月小厨 发表于 2013-3-9 11:58
在BUZZER端口处于OD模式时,符合你的测试结果;

我的BUZZER端口处于推挽输出模式,可以达到要求
明月小厨 发表于 2013-3-9 12:50 | 显示全部楼层
现在更新换代的速度很快;前些年还大力推广的LM的很多器件已经下架了;
STM32F10X也是面世有些年头了,目前还是主力;现在F2,F3,F4都一个个冒出来了,还有F0功能性能也差不多,价格却只有F10x的一半;
明月小厨 发表于 2013-3-9 12:53 | 显示全部楼层
the_ether 发表于 2013-3-9 12:35
我的BUZZER端口处于推挽输出模式,可以达到要求

推拉输出,怎么三极管都驱动不了呢?
PNP的三极管如果接电源正,OC模式是可以的;
能OC的时候,不要用PP;
明月小厨 发表于 2013-3-9 12:54 | 显示全部楼层
真晕,你还接1K的电阻;轰鸣器内阻有多少?分压后还有多大的声音?
 楼主| the_ether 发表于 2013-3-9 14:14 | 显示全部楼层
明月小厨 发表于 2013-3-9 12:54
真晕,你还接1K的电阻;轰鸣器内阻有多少?分压后还有多大的声音?

我现在就是正极接VCC,负极直接接的IO管脚,现在测试表明推挽输出模式可以驱动
明月小厨 发表于 2013-3-9 16:31 | 显示全部楼层
你胆子够大;直接驱动;
 楼主| the_ether 发表于 2013-3-9 17:01 | 显示全部楼层
明月小厨 发表于 2013-3-9 16:31
你胆子够大;直接驱动;

我真心没搞懂是咋回事,现在是直接驱动,没有任何问题,如果一旦用三极管的话,BEEP两管脚的电压只会在2V左右
laoxu 发表于 2013-3-9 17:46 | 显示全部楼层
the_ether 发表于 2013-3-9 17:01
我真心没搞懂是咋回事,现在是直接驱动,没有任何问题,如果一旦用三极管的话,BEEP两管脚的电压只会在2V ...

短接你的1K电阻,将220欧改成1K-10K。
dirtwillfly 发表于 2013-3-9 18:54 | 显示全部楼层
谢谢楼主的分享,学习了
cjhk 发表于 2013-3-9 21:08 | 显示全部楼层
学习一下  这个帖子不错哦  呵呵  顶一个  需要好好理一理  这段时间一直在搞这一块  很多知识点  个人认为不是吃的恨透  需要不断学习  呵呵   顶一个
sxhhhjicbb 发表于 2013-3-9 21:56 | 显示全部楼层
蜂鸣器那个电源要5V。
huangfeng33 发表于 2013-3-9 22:05 | 显示全部楼层
直接驱动,搞不好会报废的,那是硬伤啊 ……
 楼主| the_ether 发表于 2013-3-9 22:15 | 显示全部楼层
huangfeng33 发表于 2013-3-9 22:05
直接驱动,搞不好会报废的,那是硬伤啊 ……

真的没有报废啊。。。你是说STM32报废还是蜂鸣器报废。。我用了两天了。没有任何问题。
 楼主| the_ether 发表于 2013-3-9 22:15 | 显示全部楼层
sxhhhjicbb 发表于 2013-3-9 21:56
蜂鸣器那个电源要5V。

我用的3.3V。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

13

主题

95

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0