调试STM8单片机PWM功能的时候,经常会遇到一种情况,就是PWM初始化设置完成之后,程序下载到单片机中,确没有任何波形的输出。有时候代码是下载别的调试好的,但是在自己芯片上就是没有波形输出。这时要么骂双穿代码的人忽悠人,上传的代码是错的,要么怀疑自己的单片机坏了。
现在就来分析一下,命名代码正确,但是确没有波形输出这种情况要如何分析判断。
首先来看一下PWM的初始化代码
void TIM1_Init( void )
{
TIM1_CCMR2 = 0x60; //TIM1 CH2 输出模式 PWM1
TIM1_CCER1 |= 0x10; //CC2为输出
TIM1_PSCRH = 0x00;
TIM1_PSCRL = 0x03; //16M/(1+3)=4 M
TIM1_ARRH = 1000 >> 8; //设定自动重装载值高8位
TIM1_ARRL = 1000; //设置自动重装载值低8位
TIM1_CCR2H = 500 >> 8; //捕获比较寄存器高8位
TIM1_CCR2L = 500; //捕获比较寄存器低8位 占空比值
TIM1_BKR = 0x80; //刹车寄存器 使能OC1输出 定时器不工作时输出无效电平
TIM1_CR1 |= 0x01; //允许定时器中断
}
设置TIM1_CCMR2为0x60,也就是设置了定时器1的通道2为 PWM1 输出模式。接下来设置TIM1_CCER1寄存器值为0x10,设置了定时器1通道2输出使能。TIM1_PSCR寄存器用于设置定时器的分频器值,这里分频器值设置为3,计数器的时钟频率(f CK_CNT )等于f CK_PSC /( PSCR[15:0]+1)。 根据公式可以计算定时器的频率,系统频率为16M,所以定时器的频率为 16/(3+1)=4M,也就是定时器的工作频率为4M。TIM1_ARR寄存器用于设置自动重装载值,也就是输出PWM的频率,这里设置为1000,定时器的工作频率为4M,自动重转载值为1000,那么PWM输出的频率就为 4000000 / 1000 = 4000HZ,也就是说PWM的输出频率为4K,TIM1_CCR2寄存器用于设置通道2的比较值,也就是计数器会和这个值进行比较。当计数器的值大于这个值之后,输出的电平就会翻转。
通过官方的资料也可以看出,在PWM1模式下,当计数器的值小于TIM1_CCR的值时,输出有效电平,当计数器的值大于TIM1_CCR的值时,输出为无效电平。
有效电平是在TIM1_CCER1中设置的。
为0时,默认为高电平有效,所以这里当计数器小于500时,输出高电平,当计数器值大于500时输出电平。
最后通过TIM1_BKR设置输出使能,TIM1_CR1开启计数器。这样在定时器1通道2引脚就可以输出PWM波了。
将示波器挂在PC7引脚上,观察波形,这时发现没有任何波形输出?难道PWM的初始化设置有问题? 这里初始化设置的没有任何问题。不过在使用STM8单片机的时候,要特别注意一点。就是单片机引脚的复用功能开启。
在STM8单片机中有一个选项字节,这个选项字节就是专门用于设置单片机IO引脚的复用功能重映射的,因为有的IO口好多个功能,那么具体每个IO口要使用哪个功能,就是由这个选项字节来设置的。
这个OPT2就是用来设置复用功能的,NOPT2是OPT2的反码。这个OPT2共有8个位,每一位用0和1来代表不同的功能。
具体每一位代表的含义如下图所示:
这个OPT2默认值都为0,也就是说默认的引脚功能都为上面的一行。上面代码中使用的是定时器1通道2引脚,也就是TIM1_CH2,这个功能是通过AFR0位设置的。在表中可以看出AFR0位默认的功能是SPI引脚功能,而PWM需要的TIM功能,必须要将OPT0的第0位,也就是AFR0位设置位1才行。
这个选项字的设置有两种方法,一种是通道在程序中添加选项字的设置代码,另一种是直接在烧写软件的界面设置。通过代码来设置选项字的方法这里就不介绍了,因为毕竟麻烦,而且容易出错。这里直接介绍使用烧写软件来设置。
这里用到的烧写软件为ST Visual Programmer
打开后界面如下:
用这个软件向单片机烧写程序的时候就可以直接设置选项字了,将上面编写的代码编译。然后使用这个烧写软件打开编译生成的文件。
打开后,用鼠标单击软件下面的OPTIN BYTE选项,这时候就会打开这个代码的选项设置,此时软件上面就会显示AFR0—AFR7的默认选项。通过上面选项字节的表格分析可以知道,这里需要设置的是AFR0,用鼠标点一下AFR0这一行的最后边。
这时候就可以看到AFR0后面的选项就会出现一个向下的箭头,底下总共会出现两个选项,上面的选项也就是设置值为0时的选项,下面的选项是这是值为1时的选项,这里肯定要选择下面的选项。
这时可以看到下面的选项中就可以看到当前设置的功能为 PC5为 TIM2_CH1,PC6 为 TIM1_CH1, PC7 为 TIM1_CH2。同时最左边选项字节状态的第2位值,也变为了01。 说明定时器的功能已经设置成功了。这里要注意一点,这里选项字设置之后,PC5、PC6、PC7三个IO口的默认功能都会发生改变。
设置好之后,直接将代码烧写到单片机中,这时就会发现,示波器上已经输出了波形。
如果以后在调试代码的过程中发现单片机的工作不正常,首先要检测检查IO口使用的功能是不是需要开启重映射功能,确保重映射功能正常后,再检查其他地方。
上一篇:STM8将库函数移植为寄存器方法
下一篇:STM8输出PWM变频时波形断开解决方法
推荐阅读
史海拾趣
在电子行业的早期,Consolidated Wire公司以其出色的技术研发能力崭露头角。公司投入大量资源研发新型导电材料,成功推出了一种具有更高导电性能和更低电阻的新型线材。这一技术突破不仅提升了电子设备的性能,还降低了能耗,赢得了市场的广泛认可。随着新型线材的普及,Consolidated Wire公司的业务规模迅速扩大,逐渐在电子线材市场占据了领先地位。
面对不断变化的市场需求和技术趋势,Consolidated Wire公司始终保持创新精神。公司不断研发新产品、新技术,满足客户的多样化需求。同时,公司还注重与其他行业的合作与交流,通过跨界合作推动产品创新和技术升级。这种创新驱动的发展模式使得Consolidated Wire公司能够持续保持竞争优势,实现持续稳健的发展。
随着公司业务的不断发展,FASTRAX开始积极拓展海外市场,并与多家国际知名企业建立了战略合作关系。通过与这些企业的合作,FASTRAX不仅获得了更多的市场份额,也学习到了先进的管理经验和技术知识。这些合作经验为FASTRAX的持续发展奠定了坚实的基础。
现在提供用于 MSP430™ MCU 的全新 Micrium RTOS 代码样例 如果您在设计医疗及其他安全关键型应用,那么目前针对 MSP430 微控制器提供的 Micrium 公司的 µC/OS-II™ 和 µC ...… 查看全部问答∨ |
|
在LM3S9B92上用IAR在线调试ucosII时出现指针越界 我的开发环境是IAR6.40.1+Jlink+LM3S9B92+ucosIIv2.92(官方移植代码) 我的ucosIIv2.92移植代码(移植到LM3S9B92)是从ucosII的官网上获得的,未经任何修改,但在单步调试到如下 步骤时会出现指针越界情况 OSStartHighRdy LDR&nb ...… 查看全部问答∨ |
|
IAR编译ZStack-CC2530为可下载运行的HEX文件的正确配置 最近几个月一直在研究zigbee技术,发现有用的资料特少而且好多还有错误。就比如如何生成hex这步相当重要可以说为制作bootloader做铺垫的。先来一个网上比较流行的资料吧,其实这位作者说的基本没错,但是可能表述不清,导致让人误解生成hex有两种方 ...… 查看全部问答∨ |