串口输出乱码
自己做了一个基于atmega328的板子,很奇怪的是使用FTDI的5V供电就没有乱码,但是一旦使用了外部供电就全是乱码,我一直以为是电源问题,后来意识到是因为FTDI如果要正常的接收数据需要和芯片的供电共地。。。
STM32晶振相关
2个晶振,一个是HSE,常用外部高频,PLL倍频用,常为8MHz。
另一个为外部低频晶振,也称时钟晶振,计时用,或系统待机或低功耗时用,为32.768KHz。
为什么是32.768KHz ?
2^15/32.768KHZ=1秒 定时精度比单片机内部定时高。
STM32一个引脚在输出的同时读取输入状态
控制继电器并且需要配置继电器的工作状态,之前想的时一个引脚输出用另一个引脚读取这个输出引脚的状态,其实可以不必要这样浪费引脚,字节将引脚配置成推挽输出,这个时候就可以直接使用GPIO_ReadInputDataBit来读取该引脚的状态,不需要第二个引脚:
relay.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#ifndef __RELAY_H #define __RELAY_H #include "sys.h" #define RELAY0 PBout(9) #define RELAY_STATUS GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)//PB7读取继电器状态 void RELAY_Init(void);//初始化 默认为关闭状态 u8 Read_Relay_Status(void); //获取继电器的状态函数 #endif |
relay.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include "relay.h" /* ************************************************************ * 函数名称: RELAY_Init * * 函数功能: 初始化PB5的LED并使能时钟 * * 入口参数: baud:设定的波特率 * * 返回参数: 无 * * 说明: PB5 ************************************************************ */ void RELAY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//使能PORTB口时钟、复用引脚PB3、PB4引脚 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PB6 控制继电器的输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_9); // 低 } |
STM32 晶振起振异常
STM32晶振起振了(通过短路晶振,LED不闪烁的现象判断晶振起振了),但是发现时钟仍然不正常,似乎少了10倍,后来排查发现是由于晶振的电容配置不正确导致的,8Mhz的主晶振必须时22pF,另一个RTC的晶振必须时10pF,之前使用了20pF就出现了这个问题。