stm32定时器总结心得

stm32定时器学习总结 (主要是对几个寄存器进行说明)

1. 时基结构体两个成员的配置 
分频因子(PSC)和自动重装载寄存器(ARR)

计数 1s 可以自己配置的
先计算计数器计一次的时间 
(系统时钟为72MHZ,)
CK_CNT = CK_PSC(系统时钟) / (PSC+1) (PSC为分频因子 结构体配置成员)

如配置PSC为72(由于自动加一所以配置时要减一) 

72MHZ/72 = 1MHZ 

T = 1/ f = 1/1*10^6 s 

T = 1us 

输出速度 
配置分频因子和自动重装载寄存器ARR 

PWM信号频率F = 定时器时钟(72MHZ)/ (ARR+1)*(PSC+1) 

例 : 输出一个13Khz的信号 设定ARR的值为900
13khz = 72M/(899+1)*(PSC+1)
          = 72000000 / 900PSC
          = 80000/PSC
    PSC=80000/13000
PSC = 6.153 

     
两种PWM输出模式 

PWM1       配置ARR寄存器  再配置CCR寄存器 进行比较 如果计数次数 CNT<CCR 为有效 (一般设置为高电平)  (CNT从0计数到ARR溢出值)  (CCR为我自己配置的值)  当ARR>CNT>CCR的时候 CH电平为无效(为低电平)   

例1: 如ARR为500 CCR配置为250时    
在0到250为高电平 251到500为低电平 一半一半 


PWM2       配置ARR寄存器  再配置CCR寄存器 进行比较 如果计数次数 CNT<CCR 为无效 (一般设置为低电平)  (CNT从0计数到ARR溢出值)  (CCR为我自己配置的值)  当ARR>CNT>CCR的时候 CH电平为有效(为高电平)   

例2: 如ARR为900 CCR配置为400时    
当我CCR配置为900时  CNT永远不会高于CCR 永远为低电平  

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ClassWizard中响应ID为~Dlg中的WM_TIMER消息。 使用SetTimer(nIDEvent,time,NULL)来建立一个定时器,关闭定时器用KillTimer(nIDEvent)函数。 然后可以响应ON_WM_TIMER消息来响应一个定时器完成一次记时后的程序。 响应方式如下: void CTimeDlg::OnTimer(UINT nIDEvent) { if(nIDEvent==1000)//间隔为5秒 { //处理事件 } elseif(nIDEvent==1001)//间隔为10秒 { //处理事件 } CDialog::OnTimer(nIDEvent); } 以下是给出一个串口通信定时检查接收数据的部分代码 void CMyDlg::OnOpenCom() { // TODO: Add your control notification handler code here if( f_open_com==true ) { f_open_com = false; GetDlgItem(IDC_OPEN_COM)->SetWindowText("打开通信端口"); CloseHandle(hComm); KillTimer(1000); /// 关闭定时器 return ; } SetTimer(1000, 1000, NULL); ///nIDEvent==1000,time=5000ms const char *ComNo; DCB dcb; string temp("COM1"); ComNo = temp.c_str(); hComm = CreateFile( ComNo , GENERIC_READ|GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , 0 , 0); if( hComm==INVALID_HANDLE_VALUE ) /// 如果端口未打开 { MessageBox("打开通信端口出错!" , "Comm Error" , MB_OK); return ; } /// 将dcb地址传入,以取得通信参数 GetCommState(hComm,&dcb); /// 得知目前通信状态 dcb.BaudRate = CBR_9600; dcb.ByteSize = 8; /// 字节为8 dcb.Parity = NOPARITY; /// Parity为None dcb.StopBits = ONESTOPBIT; /// 1个停止位 if( !SetCommState( hComm , &dcb)){ MessageBox("通信端口设置出错!" , "Set Error" , MB_OK ); CloseHandle(hComm); return; } GetDlgItem(IDC_OPEN_COM)->SetWindowText("关闭通信端口"); f_open_com = true; } void CMyDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default char inbuff[1024]; DWORD nBytesRead , dwError; COMSTAT cs; /// 取得状态 ClearCommError( hComm , &dwError , &cs); /// 数据是否大于所准备的缓冲区 if( cs.cbInQue > sizeof(inbuff) ) { PurgeComm(hComm , PURGE_RXCLEAR ); /// 清除通信端口数据 return ; } ReadFile(hComm , inbuff , cs.cbInQue , &nBytesRead , NULL ); //接收通信端口的数据 inbuff[cs.cbInQue] = '\0'; MessageBox("打开通信端口出错!" , "Comm Error" , MB_OK); m_Receive.Format("%s",inbuff); UpdateData(false); CDialog::OnTimer(nIDEvent); } 李杨: for(int i=0; ;i++ ) { ... Sleep(5); if(i>...) {AfxMessageBox("错误XXX"); return;} }//跳出后记得停止一些机器动作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值