วิธีเซ็ต STM32F107's Baud rates 600 bps

Started by Knightbot13, March 02, 2013, 12:40:30 AM

Previous topic - Next topic

Knightbot13

อยากทราบวิธีเซ็ต Baud rates ต่ำๆบน STM32 คือตอนแรกใช้ 72MHz ครับ แต่เซ็ต Baud UART เป็น 600 มันส่งเพี้ยนมา แต่พอผมใช้ 36MHz ข้อมูลถูกต้องครับ
อยากทราบว่าจะเซ็ต Baud 600 bps โดยที่ใช้ clock 72MHz ได้ไหมอ่าครับ

pa_ul

ค่าตัวหารสูงสุดมีอยู่ 12 บิท คือ 4095 baud rate ต่ำสุดที่ทำได้คือ
- ที่ 36MHz   :   36MHz / (16*4095) = 549.45
- ที่ 72MHz   :   72MHz / (16*4095) = 1099


อ้อ....เวลาโพสต์มาไม่ต้องใส่ "อ่า" มาก็ได้ครับ เดี๋ยวคนรู้หมดว่าพูดติดอ่าง

deejun

ใช่ uart ตัวไหนครับไม่ได้บอกอะไรเลย

USART1  ====> Bus Clock  =  72Mhz  อยากได้ 600 ต้องตั้งตัวหาร  = 120000 
UART2    =====>Bus Clock  =  36Mhz อยากได้ 600 ต้องตั้งตัวหาร  = 60000
UART3    =====>Bus Clock  =  36Mhz อยากได้ 600 ต้องตั้งตัวหาร  = 60000
UART4    =====>Bus Clock  =  36Mhz อยากได้ 600 ต้องตั้งตัวหาร  = 60000
------------------------------------------------------------------------------
USARTX->BRR =  Bus clock/ค่าความเร็วที่ต้องการถ่ายถอด


pa_ul

Quote from: deejun on March 04, 2013, 02:46:29 PM
ใช่ uart ตัวไหนครับไม่ได้บอกอะไรเลย

USART1  ====> Bus Clock  =  72Mhz  อยากได้ 600 ต้องตั้งตัวหาร  = 120000 
UART2    =====>Bus Clock  =  36Mhz อยากได้ 600 ต้องตั้งตัวหาร  = 60000
UART3    =====>Bus Clock  =  36Mhz อยากได้ 600 ต้องตั้งตัวหาร  = 60000
UART4    =====>Bus Clock  =  36Mhz อยากได้ 600 ต้องตั้งตัวหาร  = 60000
------------------------------------------------------------------------------
USARTX->BRR =  Bus clock/ค่าความเร็วที่ต้องการถ่ายถอด

ตัวหาร USART_BBR register ของ STM32F10t ใช้งานได้แค่ 16 บิทนะครับ ไม่ใช่ 32 บิท จึงไม่สามารถใส่ค่า 120000 ได้

deejun

Quote from: pa_ul on March 04, 2013, 06:35:19 PM
Quote from: deejun on March 04, 2013, 02:46:29 PM
ใช่ uart ตัวไหนครับไม่ได้บอกอะไรเลย

USART1  ====> Bus Clock  =  72Mhz  อยากได้ 600 ต้องตั้งตัวหาร  = 120000 
UART2    =====>Bus Clock  =  36Mhz อยากได้ 600 ต้องตั้งตัวหาร  = 60000
UART3    =====>Bus Clock  =  36Mhz อยากได้ 600 ต้องตั้งตัวหาร  = 60000
UART4    =====>Bus Clock  =  36Mhz อยากได้ 600 ต้องตั้งตัวหาร  = 60000
------------------------------------------------------------------------------
USARTX->BRR =  Bus clock/ค่าความเร็วที่ต้องการถ่ายถอด

ตัวหาร USART_BBR register ของ STM32F10t ใช้งานได้แค่ 16 บิทนะครับ ไม่ใช่ 32 บิท จึงไม่สามารถใส่ค่า 120000 ได้


16 bit  ค่า สูงสุดได้แค่ 0xFFFF ครับ แต่ตัวอย่างมัน 120000  ซึ่งเกินค่า ถูกต้องครับ
แต่ถ้าต้องการเซ็ทค่าความถี่ที่ 72000000 hz หรือ 72Mhz  ตามตัวอย่าง  ต้องใช้ ปรีสเกลมาช่วยครับ
ใช้ PCLK 2 = APB2(/2) จะได้เท่ากับ 36Mhz   มีผลกระทบกับโมดูลที่ใช้ สัญญาณจาก PCLK2 เท่านั้น
นอกนั้น เป็นปกติ  PCLK1 ก็ยังเท่าเดิม  ความถี่ก็ยังเท่าเดิม ที่แหล่งกำเนิด PLL9   Fs =  72Mhz

สิ่งที่ควรปฏิบัติ ตามข้อมูลคือ ที่xtal 8Mhz ค่าความถี่สูงสุดคือ 72 Mhz 
ค่าPCLK1 สูงสุดคือ  36 Mhz  ดังนั้น APB1 จะต้องหาร 2
ค่าPCLK2 สูงสุดคือ  72 Mhz  ดังนั้นAPB2 จะต้องหารน้อยที่สุดได้คือ หาร1

แต่ว่าต้องแยกระหว่า Fs, PCLK1 ,PCLK2 จากกัน ความถี่ใครความถี่มัน
Fs เป้นตัวกระจายความถี่ไปตามโมดูลต่างๆ

ถ้าต้องการ Fs ที่ 72Mhz   ก็ต้องหารที่ PCLK2 ให้เหลือ 36 Mhz  USART1 จะใช้ความถี่นี้ ที่PCLK2

USARTX->BRR =  36000000/6000 = 0xEA60 = 60000
UART2,UART3,UART4,UART5 ใช้ความถี่จาก PCLK1 อยู่แล้วเลยได้อนิสง  ที่ความถี่36Mhz อยู่แล้ว มันถูกหารโดยเงื่อนไขกำหนด
จากผู้ผลิตที่กำหนดไว้  เลยสามารถทำให้ทำงานได้เลย