STM32F1 interrupt

Started by tha, September 20, 2020, 08:55:49 AM

Previous topic - Next topic

tha

10 Interrupts and events

10.1 Nested vectored interrupt controller (NVIC) Features(ลักษณะตัวควบคุมการอินเตอรัพท์ซ้อน)
   • 68 (ไมรวม the sixteen Cortex®-M3 interrupt lines)
   • 16 programmable priority levels(ระดับความสำคัญที่โปรแกรมได้) (4 bits ของ interrupt priority ถูกใช้ในการตั้ง)
   • Low-latency(เวลาแฝงต่ำ) exception และ interrupt handling
   • Power management control
   • การใช้งานให้เป็นผลของ System Control Registers
The NVIC และ the processor core interface เชื่อมต่อติดกัน, ซึ่งทำให้สามารถทำ low latency interrupt processing และโปรเซส late arriving interrupts(การอินเตอรัพท์ที่มาถึงทีหลัง) ได้อย่างมีประสิทธิภาพ.

interrupts ทั้งหมดรวมถึง the core exceptions ถูกจัดการโดย the NVIC. สำหรับข้อมูลที่มากขึ้นของ exceptions and NVIC programming, ถูกกล่าวถึงใน STM32F10xxx Cortex®-M3 programming manual (ดูเอกสารที่เกี่ยวข้องในหน้า 1).

10.1.1 SysTick calibration value register
The SysTick calibration value ถูกตั้งได้ถึง 9000, ซึ่งให้ reference time base เท่ากับ 1 ms ด้วย the SysTick clock ที่ตั้งที่ 9 MHz (สูงสุดที่ HCLK/8).

tha

10.1.2 Interrupt and exception vectors
Table 61 and Table 63 เป็น the vector tables ของ connectivity line และ STM32F10xxx devices อื่นๆ, ตามลำดับ





ปล. exception มันหมายถึงตัวไหนนะ ตรงที่เขาแรงเงาไว้ในตารางหรือเปล่าครับ ท่านใดทราบช่วยอธิบายด้วย

tha

ท่านใดให้อธิบายการเกิดอินเตอรัพท์สักหน่อย ก็จะอธิบายตามความเข้าใจนะ ถ้าเกิด interrupt อย่างเช่น EXTI0 interrupt, Program Counter จะกระโดดมาที่ Address 0x0000 0058 ก่อน แล้วที่ Address 0x0000 0058 นี้ จะบรรจุคำสั่งให้กระโดดไปที่โปรแกรมย่อย Interrupt Service Routine EXTI0 อีกที เมื่อปฏิบัติตามคำสั่งใน Interrupt Service Routine EXTI0 เสร็จแล้ว ก็จะกระโดกลับไปที่โปรแกรม main(); ในบรรทัดก่อนที่จะเกิดการอินเตอรัพท์ เพื่อปฏิบัติคำสั่งต่อไป
ปล. อ่านแล้วเข้าใจกันไหม พอจะจำได้เคยแปล Atmega328p มาก่อน คงจะเหมือนกัน ท่านมีอะไรเสริมก็ว่ามาได้นะครับ


tha

Priority ก็เรียงลำดับตัวเลขในตารางเลย ตัวเลขต่ำก็จะมีลำดับความสำคัญที่สูงกว่า อย่าง BusFault ก็จะมีลำดับความสำคัญที่สูงกว่า EXTI0 ถ้าเกิด EXTI0 interrupt แล้วโปรแกรมกำลังปฏิบัติในโปรแกรมย่อย interupt service routine EXTI0 อยู่นั้น ถ้ามีการเกิด BusFault interrupt เกิดขึ้น(ที่มีลำดับความสำคัญสูงกว่า) โปรแกรมก็จะหยุดทำงานในโปรแกรมย่อย interupt service routine EXTI0 ไว้ก่อน แล้วจึงกระโดดไปทำงานในโปรแกรมย่อย interupt service routine BusFault ก่อน เมื่อปฏิบัติในโปรแกรมย่อย interupt service routine Busfault เสร็จแล้ว ถึงจะกระโดมาปฏิบัติในโปรแกรมย่อย interupt service routine EXTI0 ที่ยังค้างอยู่ให้เสร็จต่อไป แล้วถึงจะกระโดดกลับโปรแกรม main();

Priority ที่ fixed ก็คือตั้งไม่ได้ ถ้า settable ก็สามารถตั้งได้ Priority bits แต่ละอินเตอรัพท์ก็จะมีอยู่ 4 บิต ก็จะตั้งได้ 16 ลำดับความสำคัญ ถ้าโปรแกรมของเรามีหลายอินเตอรัพท์ เราก็จะสามารถเปลี่ยนลำดับความสำคัญของแต่ละอินเตอรัพท์ ด้วยการกำหนดแต่ละ Priority bits 4 บิตนี้ เอ๊ะรีจีสเตอร์อยู่ไหนกันนะ หาไม่เจอ เอาเข้าใจคร่าวๆไว้ก่อนนะครับ

tha

ถ้าอินเตอรัพท์ลำดับความสำคัญที่สูงกว่ากำลังปฏิบัติงานอยู่ แล้วเกิดอินเตอรัพท์ลำดับความสำคัญที่ต่ำกว่าเกิดขึ้น อินเตอรัพท์ลำดับความสำคัญที่ต่ำกว่าจะคอยให้อิเตอรัพท์ลำดับความสำคัยที่สูงกว่าทำงานเสร็จงานก่อน อินเตอรัพท์ลำดับความสำคัญที่ต่ำกว่าถึงจะทำงาน

dec

Quote from: tha on September 20, 2020, 11:21:53 AM
ท่านใดให้อธิบายการเกิดอินเตอรัพท์สักหน่อย ก็จะอธิบายตามความเข้าใจนะ ถ้าเกิด interrupt อย่างเช่น EXTI0 interrupt, Program Counter จะกระโดดมาที่ Address 0x0000 0058 ก่อน แล้วที่ Address 0x0000 0058 นี้ จะบรรจุคำสั่งให้กระโดดไปที่โปรแกรมย่อย Interrupt Service Routine EXTI0 อีกที เมื่อปฏิบัติตามคำสั่งใน Interrupt Service Routine EXTI0 เสร็จแล้ว ก็จะกระโดกลับไปที่โปรแกรม main(); ในบรรทัดก่อนที่จะเกิดการอินเตอรัพท์ เพื่อปฏิบัติคำสั่งต่อไป
ปล. อ่านแล้วเข้าใจกันไหม พอจะจำได้เคยแปล Atmega328p มาก่อน คงจะเหมือนกัน ท่านมีอะไรเสริมก็ว่ามาได้นะครับ

ใน ARM Cortex M ขั้นตอนตรงนี้มันไม่อยู่ในส่วนที่เราเข้าไป track ดูได้ครับ
ใน Address 0x00000058 จะแค่เก็บ Address ของ Interrupt Service Routine EXTI0 เท่านั้นครับ
ไม่มี Code สำหรับ Jump ไปที่ Interrupt Service Routine ของ EXTI0 แต่อย่างใดครับ
ผมก็ไม่แน่ใจว่ามันมีการ Jump ไปยัง code ส่วนไหนก่อนรึเปล่า ใน Code เราจะเห็นแค่ว่าโปรแกรมทำงานอยู่ใน main
แล้วอยู่ๆ ก็มาโผล่ใน Interrupt Service Routine เลย พอทำงานใน Interrupt Service Routine เสร็จ ก็กลับมาที่ main

บางทีการโหลด Address แล้ว Jump ไป Interrupt Service Routine อาจทำโดย Hardware แต่เราสามารถดูได้ว่า
ทันทีที่มีเข้าสู่ Interrupt Service Routine มันจะมีการ Backup Register R0 - R3, R12, LR, PSR และ Address
ที่จะ Return กลับไป ลง Stack ส่วนเวลา Return กลับไปยัง Main มันไม่ได้ Return ไป Address ที่จะกลับไปใน Main โดยตรง
มันจะ Return ไปส่วนที่เรียกว่า EXC_RETURN code (มี Address อยู่ในช่วง 0xF0000000 - 0xFFFFFFFF) ซึ่งมันจะเป็นการ
execute แบบพิเศษ ไม่ได้เป็น instruction set แบบปกติ

tha

ขอบคุณครับ คุณ dec ลืมแล้วเหมือนกัน นี่เพิ่งจะเริ่มต้นเอง ค่อยเป็นค่อยไป เดี๋ยวจะแกะไปเรื่อยๆ มีอะไรก็เสริมมานะครับ
เจอแล้ว NVIC priority bits มันจะอยู่ในส่วน CMSIS Core ไม่ได้อยู่ส่วน peripheral ต้องมาดูที่ programming manaul ดูเอาคร่าวๆก่อนนะครับ มันเยอะมาก
https://www.st.com/resource/en/programming_manual/cd00228163-stm32f10xxx-20xxx-21xxx-l1xxxx-cortex-m3-programming-manual-stmicroelectronics.pdf

tha

ท่านใดแนะนำให้แปล NVIC เดี๋ยวจะแปลเฉพาะ 4.3 Nested vectored interrupt controller (NVIC) ใน programming manual นะ แปลทั้งหมดเดี๋ยวจะมากไปยังไม่ได้ใช้งาน จะได้เข้าใจเรื่องการ interrupt กัน เอาอันไหนก่อนก็บอกมากันนะ วันนี้ดูคร่าวๆแล้วก็เครียดอยู่ เอาไว้วันหน้านะครับ