<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>nrf52832 pwm interrupt at end of period</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/63846/nrf52832-pwm-interrupt-at-end-of-period</link><description>Hello everyone, 
 I&amp;#39;m trying to make a PWM signal that fires an interrupt at the end of each PWM period. I&amp;#39;ve had the same question here: 
 https://devzone.nordicsemi.com/f/nordic-q-a/45182/nordic-nrf51822-pwm-ppi-timer1 
 but now I&amp;#39;m using nrf52832.</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Thu, 16 Jul 2020 12:15:31 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/63846/nrf52832-pwm-interrupt-at-end-of-period" /><item><title>RE: nrf52832 pwm interrupt at end of period</title><link>https://devzone.nordicsemi.com/thread/260355?ContentTypeID=1</link><pubDate>Thu, 16 Jul 2020 12:15:31 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:7622a4f1-c13f-4176-a9bf-23579814e593</guid><dc:creator>L.B.</dc:creator><description>&lt;p&gt;OK, so there is no legal way to do it, because the event NRF_PWM_EVENT_PWMPERIODEND is not being used by the driver.&lt;/p&gt;
&lt;p&gt;Here is how I did it, with combined approach driver API + register access:&lt;/p&gt;
&lt;p&gt;#include &amp;quot;nrf_drv_pwm.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrfx_pwm.h&amp;quot;&lt;br /&gt;&lt;br /&gt;static nrf_drv_pwm_t m_pwm1 = NRF_DRV_PWM_INSTANCE(1);&lt;br /&gt;&lt;br /&gt;static nrf_drv_pwm_config_t config1 = {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.output_pins = {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;3, // channel 0&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;NRF_DRV_PWM_PIN_NOT_USED, // channel 1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;NRF_DRV_PWM_PIN_NOT_USED, // channel 2&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;NRF_DRV_PWM_PIN_NOT_USED&amp;nbsp; // channel 3&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.irq_priority = APP_IRQ_PRIORITY_LOWEST,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.base_clock&amp;nbsp;&amp;nbsp; = NRF_PWM_CLK_16MHz,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.count_mode&amp;nbsp;&amp;nbsp; = NRF_PWM_MODE_UP_AND_DOWN,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.top_value&amp;nbsp;&amp;nbsp;&amp;nbsp; = 116, //~70kHz&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.load_mode&amp;nbsp;&amp;nbsp;&amp;nbsp; = NRF_PWM_LOAD_INDIVIDUAL,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.step_mode&amp;nbsp;&amp;nbsp;&amp;nbsp; = NRF_PWM_STEP_AUTO&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;static nrf_pwm_values_individual_t /*const*/ seq_values[] = {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{0x4D}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;static nrf_pwm_sequence_t const pwm_seq_settings = {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.values.p_individual = seq_values,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NRF_PWM_VALUES_LENGTH(seq_values),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.repeats&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;.end_delay&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;void user_touch_pwm_handler(nrf_drv_pwm_evt_type_t event_type){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;static uint32_t count = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(count == 9){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;nrf_drv_pwm_uninit(&amp;amp;m_pwm1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;count++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void user_touch_pwm_init(void){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;nrf_drv_pwm_init(&amp;amp;m_pwm1, &amp;amp;config1, user_touch_pwm_handler);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;m_pwm1.p_registers-&amp;gt;INTENSET |= NRF_PWM_INT_PWMPERIODEND_MASK;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;nrf_drv_pwm_simple_playback(&amp;amp;m_pwm1, &amp;amp;pwm_seq_settings, 1, NRF_DRV_PWM_FLAG_LOOP);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This program will generate 10 pulses on P0.03 with 70 kHz frequency and will stop.&lt;/p&gt;
&lt;p&gt;Regards,&lt;/p&gt;
&lt;p&gt;L. B.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nrf52832 pwm interrupt at end of period</title><link>https://devzone.nordicsemi.com/thread/260353?ContentTypeID=1</link><pubDate>Thu, 16 Jul 2020 12:06:01 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ac329c9d-93e7-4a72-a218-cc3e9cea140a</guid><dc:creator>haakonsh</dc:creator><description>&lt;p&gt;You&amp;#39;ll have to port the code to use the &lt;a title="Timer driver" href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v12.3.0/group__nrf__drv__timer.html?cp=7_5_9_6_6_24_1"&gt;Timer driver&lt;/a&gt; API&amp;#39;s. Afterwards,&amp;nbsp;what you need to do to enable the interrupt is to call&amp;nbsp;&lt;a title="nrf_drv_timer_compare_int_enable" href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v12.3.0/group__nrf__drv__timer.html?cp=7_5_9_6_6_24_1_13#ga5647281b3b8b0fe1949c161b2c1542ac"&gt;nrf_drv_timer_compare_int_enable&lt;/a&gt;(). The event handler provided to &lt;a title="nrf_drv_timer_init" href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v12.3.0/group__nrf__drv__timer.html?cp=7_5_9_6_6_24_1_19#ga02b2d6f6d83049b70faf31d41fa2627e"&gt;nrf_drv_timer_init&lt;/a&gt;&amp;nbsp;will be called on any interrupt generated by that timer instance, so you&amp;#39;ll have to determine what event it was, see:&lt;br /&gt;&lt;br /&gt;&lt;a title="nrf_drv_timer_init" href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v12.3.0/group__nrf__drv__timer.html?cp=7_5_9_6_6_24_1_19#ga02b2d6f6d83049b70faf31d41fa2627e"&gt;nrf_drv_timer_init&lt;/a&gt;,&amp;nbsp;&lt;a href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v12.3.0/group__nrf__drv__timer.html#gae6d690e9273d2bb04f382fd399fd7b41"&gt;nrf_timer_event_handler_t&lt;/a&gt;, and&amp;nbsp;&lt;a href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v12.3.0/group__nrf__timer__hal.html#ga6c7c835fd175129175fe2c08237af3c3"&gt;nrf_timer_event_t&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>