1807|5

297

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【AT-START-F425测评】 五、定时器中断代码简析及呼吸灯实现 [复制链接]

 

雅特力AT32提供了较完整的Demo例程,其中tmr例程还是非常丰富的,其中有个7_pwm_output的例程,7个管脚分别输出PWM。Readme文件中有英文说明

  - tmr1_ch1  --->  pa8
  - tmr1_ch1c --->  pb13
  - tmr1_ch2  --->  pa9
  - tmr1_ch2c --->  pb14
  - tmr1_ch3  --->  pa10
  - tmr1_ch3c --->  pb15
  - tmr1_ch4  --->  pa11

查询手册,可以看到定时器各管脚的复用情况

       可以看到,复用使用MUX2。

具体的代码部分为

int main(void)
{
	uint8_t  dir = 0;
  system_clock_config();

  at32_board_init();

  /* get system clock */
  crm_clocks_freq_get(&crm_clocks_freq_struct);

  /* turn led2/led3/led4 on */
  at32_led_on(LED2);
  at32_led_on(LED3);
  at32_led_on(LED4);

  /* enable tmr1/gpioa/gpiob clock */
  crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
//  crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);

  /* timer1 output pin Configuration */
  gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9 | GPIO_PINS_10 |GPIO_PINS_11;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init(GPIOA, &gpio_init_struct);

//  gpio_init_struct.gpio_pins = GPIO_PINS_13 | GPIO_PINS_14 | GPIO_PINS_15;
//  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
//  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
//  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
//  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
//  gpio_init(GPIOB, &gpio_init_struct);

  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_2);
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_2);
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_2);
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_2);
//  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_2);
//  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_2);
//  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_2);


  /* tmr1 configuration generate 7 pwm signals with 4 different duty cycles:
   prescaler = 0, tmr1 counter clock = system_core_clock

   the objective is to generate 7 pwm signal at 17.57 khz:
     - tim1_period = (system_core_clock / 17570) - 1
   the channel 1 and channel 1c duty cycle is set to 50%
   the channel 2 and channel 2c duty cycle is set to 37.5%
   the channel 3 and channel 3c duty cycle is set to 25%
   the channel 4 duty cycle is set to 12.5%
   the timer pulse is calculated as follows:
     - channelxpulse = duty_cycle * (tim1_period - 1) / 100 */
  
	//类似stm32的ARR,自动重新装载寄存器
  /* compute the value to be set in arr regiter to generate signal frequency at 17.57 khz */
  //timer_period = (crm_clocks_freq_struct.sclk_freq / 17570 ) - 1;
  
	//一下分别根据周期计算占空比
  /* compute c1dt value to generate a duty cycle at 50% for channel 1 and 1c */
 // channel1_pulse = (uint16_t)(((uint32_t) 5 * (timer_period - 1)) / 10);
  
  /* compute c2dt value to generate a duty cycle at 37.5%  for channel 2 and 2c */
  //channel2_pulse = (uint16_t)(((uint32_t) 375 * (timer_period - 1)) / 1000);
  
  /* compute c3dt value to generate a duty cycle at 25%  for channel 3 and 3c */
  //channel3_pulse = (uint16_t)(((uint32_t) 2 * (timer_period - 1)) / 100);
  
  /* compute c4dt value to generate a duty cycle at 12.5%  for channel 4 */
  //channel4_pulse = (uint16_t)(((uint32_t) 125 * (timer_period- 1)) / 1000);

	//原代码直接用系统主频进行计数,不分频
	//tmr_base_init(TMR1, timer_period, 0);
	//更改为分频96,及定时器主频为  96Mhz / (95 +1) = 1Mhz
	//更改Arr 为 500, 实际计数为501个
  tmr_base_init(TMR1,  500,  95);
  tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);		//向上计数方式
	tmr_clock_source_div_set(TMR1, TMR_CLOCK_DIV1);		//采用预分频的频率
	
  /* channel 1, 2, 3 and 4 configuration in output mode */
  tmr_output_default_para_init(&tmr_output_struct);
  tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_B;
  tmr_output_struct.oc_output_state = TRUE;
  tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_LOW;
  tmr_output_struct.oc_idle_state = TRUE;
  tmr_output_struct.occ_output_state = TRUE;
  tmr_output_struct.occ_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  tmr_output_struct.occ_idle_state = FALSE;
  
  // channel 1  通道1配置,以及设置占空比
  tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
  tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_1, channel1_pulse);
  
  // channel 2  通道2配置,以及设置占空比
  tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_2, &tmr_output_struct);
  tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_2, channel2_pulse);
  
  // channel 3  通道3配置,以及设置占空比
  tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_3, &tmr_output_struct);
  tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_3, channel3_pulse);
  
  // channel 4  通道4配置,以及设置占空比
  tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_4, &tmr_output_struct);
  tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_4, channel4_pulse);

  /* output enable */
  tmr_output_enable(TMR1, TRUE);
  
  /* enable tmr1 */
  tmr_counter_enable(TMR1, TRUE);

	channel3_pulse = 100;
	
  while(1)
  {
			//设置呼吸方式,最大值时递减,最小值时递增
			if(dir)channel3_pulse++; 
			else channel3_pulse--;  
			
			if(channel3_pulse>=500)dir=0; 
			if(channel3_pulse==0)dir=1; 
	
			//赋值占空比
			TMR1->c3dt = channel3_pulse;
			delay_ms(2);
			
  }
}

用的是高级定时器TMR1实现的。

 

评测的时候发现PA11没有占空比信号,通过万用表检测,发现排针(PA11)和MCU的管脚之间断开了,不知道是什么原因,个人在使用过程中对开发板的保护还是蛮好的,由此推断应该是出厂没有完全检测管脚,也给厂家提个醒。

最新回复

用镊子拨一下PA11引脚,看会不会变形,一搬LQFP封装没焊好用这种方法能试出来。   详情 回复 发表于 2022-5-23 12:29
点赞 关注
 
 

回复
举报

2万

帖子

74

TA的资源

管理员

沙发
 

建议收到,期待后续:)

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复

6841

帖子

11

TA的资源

版主

板凳
 
旁边这个是神马神器呀,看着有点象ESP8266?

点评

网友火眼金睛啊,旁边是自己设计的stm32的开发板底板,确实用了8266。  详情 回复 发表于 2022-5-4 10:42
 
 
 

回复

7452

帖子

18

TA的资源

五彩晶圆(高级)

4
 

板子不良?作为评估板这有点尴尬了。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

297

帖子

0

TA的资源

纯净的硅(初级)

5
 
lugl4313820 发表于 2022-4-29 09:27 旁边这个是神马神器呀,看着有点象ESP8266?

网友火眼金睛啊,旁边是自己设计的stm32的开发板底板,确实用了8266。

 
 
 

回复

9717

帖子

24

TA的资源

版主

6
 

用镊子拨一下PA11引脚,看会不会变形,一搬LQFP封装没焊好用这种方法能试出来。

个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
变频器的选型及配置要点

1.前言 由于电力电子技术的不断发展和进步,伴随着新的控制理论的提出与完善,使交流调速传动,尤其是性能优异的变频调速传 ...

免费样品申请经验贴--欢迎大家提供自己的经验

作为一个硬件开发人员,都非常希望能够源源不断地得到各种最新型号的芯片样品,供自己试用。虽然很多公司都推出了免费样片申请的 ...

涛行便携式MP3开发板及MP3语音播放模块资料大放送

涛行便携式MP3开发板是一款为便携功能度身定制的MP3专用学习板,可用3-4节电池供电,整机仅为名片大小.浓缩了涛行电子多年MP3相关 ...

关于IO口状态和低功耗的关系

好像在哪里看到过,如果IO是输入状态,其接入的电平对功耗有影响?哪位能详细说说原理和参数?例如接入电平为Vcc/2 另外,对于 ...

万利LPC54102开发板的uCGUI移植

本帖最后由 mars4zhu 于 2015-4-14 07:55 编辑 万利LPC54102开发板的UCGUI移植1、底层硬件与驱动代码万利的LPC54102开发板带 ...

今天遇到一个关于Keil的问题

这几天开发TouchGFX的一些功能,动态添加控件,在电脑仿真得时候还是比较顺利的,当烧录到开发板上时,怎么也不显示,用Keil调试 ...

AT32F4xx标准库BSP&Pack应用指南

为了让用户高效快速的使用Artery MCU, 我们提供了一套完整的BSP&Pack用于开发。主要包括:at32f4xx外设驱动库、内核相关文件 ...

洗碗机是如何实现水位控制的

现如今,洗碗机已经成了许多家庭厨房里的必备电器,那洗碗机到底是怎么控制水位的。 洗碗机里安装一个光电水位传感器,当水位 ...

测评颁奖: 正点原子瑞芯微RV1126 AI Linux开发板

首选感谢网友参与正点原子瑞芯微RV1126 AI Linux开发板测评活动,以下是审核结果。 1、积分奖励将于本日内发送; 2、需寄 ...

半导体大厂遭黑客勒索,不给钱员工将失业,5TB客户资料将被公开

据台媒1月16日报道,鸿海集团旗下半导体设备大厂京鼎遭黑客入侵,黑客集团更直接在网站上威胁京鼎客户与员工,如果京鼎不支付赎 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表