stm32f103c8t6有多少个外部引脚 STM32f103ZET6,学习资料
在这之前抛出来几个图片。下面慢慢解释
APB2的 RCC_APB2ENR寄存器 <1>
<2>
<3>
注意入口参数 USART1 <4>
在STM32学习过程中,肯定会涉及到寄存器的操作,例如上图的操作就是在选定了串口1的时钟使能位,并对他的时钟进行使能。
解释图1:
保留:APB2的 RCC_APB2ENR寄存器是一个32位的寄存器 ,可以观察到高16位默认不操作,只进行低十六位的操作,这样就很方便的进行后续的扩展,我们应该学会这样的扩展思维。
偏移地址:该寄存器的偏移地址表示这个寄存器在APB2的基地址上进行了偏移。偏移位为0X18;前一个寄存器的偏移值位0x14,因为32位占用了四个字节,所以这个寄存器的偏移值就成为了0x18;那顾名思义下一个的偏移地址就是0x1c;
位代表: 例如上面的第十五位 (ADC3EN) ,在我们需要打开ADC3时钟的时候就需要打开这个位,使ADC3EN置1 .此例子中需要使能USARTEN位为1. 关掉顾名思义就需要置0.这样就关掉了这个外设的时钟。
操作界限:上面的rw代表软件可以进行读写此位,所有的表示如下
寄存器操作界限
解释图2
assert_param()这个函数,这个函数是判断形参RCC_APB2Periph有没有错误,在这个里面代表USART1。
解释图3
用APB2RSTR这个寄存器来复位等式右边形参代表的实参。
解释图4
两个形参,一个代表将要使能的外设此处位USART1时钟,第二个ENABLE,代表使能。如果位DISABLE那意思就是失能USART1的时钟。
注释:特别说明下
assert_param()这个函数这个函数是使能GPIOB和GPIOE端口的时钟的。GPIOB和GPIOE是属于APB2外设的所以用函数RCC_APB2PeriphClockCmd ( xxx , xxx) 来使能,我们在进RCC_APB2PeriphClockCmd ( xxx , xxx)函数里面看看:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{
assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->APB2ENR |= RCC_APB2Periph;
}
else
{
RCC->APB2ENR &= ~RCC_APB2Periph;
}
}
在这个函数里面就可以看见我们今天要学习的函数了,在这里我们就分析函数1,以点带面
1、assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
2、assert_param(IS_FUNCTIONAL_STATE(NewState));
1、assert_failed((uint8_t *)__FILE__, __LINE__)这个函数的__FILE__, __LINE__形参,可能是c语言自带的把,具体是怎么获取错误参数的文件和行号我也不知道。
2、加入我们传递的参数是RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 虽然RCC_APB1Periph_TIM2是属于APB1的,则在程序运行时是打印不出错误参数的,因为RCC_APB1Periph_TIM2 和 RCC_APB2Periph_AFIO 都等于0x00000001,大家可以去stm32f10x_rcc.h文件去看。所以大家在使用参数检查功能时还要自己注意一下参数有没有错误。官方这个查错功能不是万能的。
主要是为了检查入口参数,以防止用户输入错误,