[video member=miotatsu stream_platform=twitch project=riscy title="Getting the PWM Interrupts to Fire" vod_platform=youtube id=CXGPKW3NM_k annotator=Miblo]
[0:07][Plug SiFive's Linux-capable HiFive Unleashed chip[ref
    site="Crowd Supply"
    page="HiFive Unleashed"
    url=https://www.crowdsupply.com/sifive/hifive-unleashed]][:hardware :research]
[5:28][Check out the HiFive Unleashed specs[ref
    site="Crowd Supply"
    page="HiFive Unleashed"
    url=https://www.crowdsupply.com/sifive/hifive-unleashed] with exciting thoughts for it in [~riscy RISCY BUSINESS]][:hardware :research]
[16:04][Plan to port pcalc to RISC-V to work on the HiFive Unleashed][:"platform layer" :speech]
[21:35][Determine to continue our investigation into the trap on mstatus in pwm_speed_test.c and to run it in gdb][:speech]
[25:12][Read section 6.2.4 - Debugging Running Programs[ref
    site="SiFive Developers"
    page="HiFive1 Getting Started Guide"
    url=https://dev.sifive.com/hifive1/hifive1-getting-started-guide/]][:research]
[27:33][Comment out the set_csr(mie, MIP_MTIP) and set_csr(mstatus, MSTATUS_MIE) calls in main()]
[28:06][Make and upload pwm_speed_test]
[29:49][Reset the board, to see that we don't trap][:run]
[29:56][Uncomment the set_csr(mstatus, MSTATUS_MIE) call in main()]
[30:08][Make, upload and reset to find that we unexpectedly fail to trap][:run]
[31:15][Reset the board in safe mode, and find that we still fail to trap][:run]
[32:41][Uncomment the handle_m_time_interrupt() and set_csr(mie. MIP_MTIP) calls in main()]
[33:10][:Run to find that we trap after a short delay]
[33:46][Read carefully through handle_m_time_interrupt()][:research]
[36:29][Copy the busy loop from led_fade.c into uart_init() in init.c, and reduce the wait time in handle_m_time_interrupt() to 2 seconds]
[38:11][:Run the program to find that we trap after waiting 2 seconds]
[38:54][Discover the USE_M_TIME #ifdef in init.c and check out the Makefile of other demos that call handle_m_time_interrupt() to find that they contain the flag -DUSE_M_TIME][:research]
[40:35][Add -DUSE_PLIC and -DUSE_M_TIME to the pwm_speed_test Makefile]
[42:00][:Run the program to find that it now works beautifully]
[42:20][Delete all the timer interrupt code, in favour of the PLIC code]
[46:59][:Run the program to see "Hello, World" but no interrupt or trap]
[48:47][Compare our PLIC code with that in global_interrupts.c, try to change PWM0_REG(PWM_CMP0) to PWM0_REG(PWM_COUNT), and instead uncomment the PLIC_set_priority() call in main()][:peripheral]
[53:15][:Run the program and hit our PWM interrupt!]
[53:44][Determine to go back to :timing][:speech]
[55:40][Read Chapter 15 - E300 Pulse-Width Modulation (PWM) :Peripheral[ref
    site="SiFive Developers"
    page="Freedom E300 Platform Reference Manual"
    url=https://www.sifive.com/documentation/freedom-soc/freedom-e300-platform-reference-manual/]][:peripheral :research :timing]
[56:42][Try setting PWM0_REG(PWM_CMP0) = 0xFFFF][:peripheral :timing]
[57:30][:Run the program to see that our interrupts fire pretty fast][:peripheral :timing]
[57:51][Try to add 0x1 to the timer rearming call][:peripheral :timing]
[58:11][:Run the program to see that our interrupts still fire pretty fast][:peripheral :timing]
[58:26][Bump straight up to 0x7 in the timer rearming call][:peripheral :timing]
[58:44][:Run the program to see that our interrupts still fire pretty fast][:peripheral :timing]
[1:00:42][Note that we wanted to be in one-shot mode, and try making pwm_0_handler() clear the PWM_CFG register][:peripheral :timing]
[1:02:05][:Run the program to see that we are correctly in one-shot mode][:peripheral :timing]
[1:02:44][Rearm the timer in pwm_0_handler()][:peripheral :timing]
[1:03:53][:Run the program to see that the timer gets rearmed each time, and note that it still runs pretty fast][:peripheral :timing]
[1:05:02][Consider the main use-case of PWM interrupts being for debouncing, and plug the Guide to Debouncing[ref
    site="The Ganssle Group"
    page="A Guide to Debouncing, or, How to Debounce a Contact in Two Easy Pages"
    url=http://www.ganssle.com/debouncing.htm]][:peripheral :research :timing]
[1:11:04][Consider alternate ways to handle debouncing, and uses for PWM interrupts][:peripheral :speech :timing]
[1:14:24][Determine that we have a good understanding of global_interrupts, and to start fully learning :timing in the next episode][:speech]
[1:15:44][Plug the new Gumroad-powered subscription solution[ref
    site=Gumroad
    page="RISCY BUSINESS"
    url=https://gumroad.com/riscy], along with a note that the Transparency Reports alone remain solely available publicly on Patreon[ref
        site=Patreon
        page="miotatsu is creating RISCY BUSINESS"
        url=https://www.patreon.com/miotatsu]][:speech]
[/video]
