教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

STM32f103C8T6入门学习记录(6)

来源:网络收集 时间:2026-07-17
导读: RX_status = USART_GetFlagStatus(USART1, USART_FLAG_RXNE);//读取接收数据标志位,如果装好了一帧数据则硬件将其置一。 if(RX_status == SET) { USART_SendData(USART1 , USART_ReceiveData(USART1));//将收到的

RX_status = USART_GetFlagStatus(USART1, USART_FLAG_RXNE);//读取接收数据标志位,如果装好了一帧数据则硬件将其置一。 if(RX_status == SET) { USART_SendData(USART1 , USART_ReceiveData(USART1));//将收到的数据再由STM32发送给PC机。 while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//等待发送完成。 } }

串口的发送接收大致如此,还是要搞懂什么数据位,硬件流,停止位,校验位什么,一个东西既然出现了就要好好分析出现的意义。想到了今天给电脑拆机清灰,电脑最好两年清一次。反正每次上螺丝都会多出那么一两个来,是不是可以不用要?

肯定不是,生产商肯定也知道节约成本什么,他们的结构工程师也知道PCB上开一个螺丝孔也是要收钱的。所以每一颗螺丝都有它的意义,所以什么校验位,停止位也有他的意义,即便我们不使用。 其实剩的螺丝我也扔了,完全不知道上在哪儿!

记于2014年6月8日 串口发送数据 百度云盘:http://pan.http://www.wodefanwen.com//s/1bn0ADLt 串口发送接收数据 百度云盘:http://pan.http://www.wodefanwen.com//s/1dD7YkZv

第五章

通用定时器的使用

1、STM32F103内部定时器有哪些?

STM32一共有8个通用16位Timer,其中TIMER1和TIMER8是高级定时器,其它的TIMER2~TIMER7是普通定时器。

此外还有一个Systick(系统滴答定时器),这个定时器通常在操作系统中作为系统的任务切换周期。

还有一个RTC,是一个毫秒定时器,支持秒级中断,用来做实时时钟计数器。 看门狗定时器 也可以算一个。

8个定时器中,Timer1 和Timer8是由APB2(输出最高频率为72MHZ)预分频后,再通过一个倍频器得到时钟频率,最高为72MHz。Timer2~Timer7则是由APB1(输出最高频率为36MHZ)预分频后,再通过一个倍频器得到时钟频率,最高为36MHz。

2、如何进行程序编写

这里我通过定时器来控制一个LED亮0.5s 灭0.5s ,交替闪烁。当然要让定时器正常工作起来,还要配置中断NVIC。定时器计数到某个数,产生中断,从而进入中断服务程序,点亮LED灯。

main函数分析:

#include \

void GPIO_Config(void)//GPIO配置 {

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能gpioc的时 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //选择管脚PC.13作LED灯 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚速度为50M GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出模式为推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure); //将上述设置写入到GPIOC里去 }

void NVIC_Config(void) //中断控制器的配置 {

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //优先组设置 NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn ; //TIM2中断选通 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断控制 NVIC_Init(&NVIC_InitStructure); }

void Timer_Config(void) //定时器的配置 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); //Timer2 时钟使能 TIM_DeInit(TIM2); //复位TIM2定时器 TIM_TimeBaseStructure.TIM_Period=1000; //定时器周期 TIM_TimeBaseStructure.TIM_Prescaler=36000-1; //预分频数

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //TIM2时钟分频,为1表示不分频

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//定时器计数为向上计数模式

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除定时器2的溢出标志位 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能定时器2溢出中断 TIM_Cmd(TIM2, ENABLE); //定时器2使能 }

int main(void) {

SystemInit();//初始化时钟,配置为72MHz,我试过将这句注释掉,好像不影响结果。查 了一下,在配置 //main函数之前的启动代码有这样一句 LDR R0, =SystemInit,我疑惑的是难 道启动的时候就配成72Mhz? GPIO_Config(); NVIC_Config(); Timer_Config(); while(1) { ; } }

中断服务函数

void TIM2_IRQHandler(void) {

static int flag_bit=0;//定义一个标志位

if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) //判断中断溢出标志为是否为1 {

TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update); //清除溢出中断标志位 flag_bit = !flag_bit; if(flag_bit == 1) GPIO_SetBits(GPIOC, GPIO_Pin_13); //熄灭LED if(flag_bit == 0)

GPIO_ResetBits(GPIOC, GPIO_Pin_13); //点亮LED }

这个函数是写在stm32f10x_it.c 里面的,我对TIM2_IRQHandler()函数的理解应该是这样的:

首先由定时器定时,定时好了产生中断溢出标志位,发送中断 然后进入中断服务函数TIM2_IRQHandler(),进入函数之后要做的就是清除中断溢出 标志位。

最后再执行函数里的其他内容。 定时器定时时间计算是这两句:

TIM_TimeBaseStructure.TIM_Period=1000; //定时器周期 TIM_TimeBaseStructure.TIM_Prescaler=36000-1; //预分频数

Prescaler可以理解为定时器的基数是72M / Prescaler+1 = 2000k,也就是500us ,Period 可以理解为要计数多少次,这里是1000次。 所以就是每500us记一次,计数1000次,就是500ms。 公式为:

Period / (72M / (Prescaler+1) )=____ 秒 1000 / (72 M/ (35999+1) ) = 0.5 秒

我有的一些疑问:1、进入中断函数之后,定时器要干些什么,是不是就停止计数了? 2、计数记到1000发生中断,计数值是不是有自动清零 问题先放到这儿,边学习,边解决。

3仿真结果观察

前面第三章已经过如何仿真波形的步骤,可以参看前面。点击setup 按钮 会弹出一个窗口,在窗口的右上边,有个new的按钮,点击后输入 PORTC.13 -

仿真运行结果如下:

可以从仿真结果中观察到,方波的周期为一秒。占空比为0.5 ,跟预期一致。

…… 此处隐藏:1904字,全部文档内容请下载后查看。喜欢就下载吧 ……
STM32f103C8T6入门学习记录(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/447809.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)