本帖最后由 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
|