Trích:
Nguyên văn bởi lybao_huy
Mình làm được rồi, chạy rất trơn tru, dùng DMA. mình cảm ơn bạn có ních bien_van_khat nhiều lắm. À mình có một thắc mắc nhỏ là:
Theo như trong datasheet DMA nó có nói là khi một ngắt A mà được chuyển cho DMA thì CPU sẽ không thể ngắt nó được, nhưng mà mình thấy nó vẫn có thể ngắt nó được nếu ngắt A này có khả ngắt. Mong giải thích dùm
|
À không, lúc trước mình đọc chưa kĩ, đọc lại thì thấy mình sai. cảm ơn sự quan tâm của Bạn.
Hiện tại mình phát nhạc với tốc độ lấy ,mẫu 16khz, stereo chạy cực tốt. Do thiếu thạch anh 24.576M, nên chưa thử play nhạc ở tốc độ 48Khz, stereo được .
Nhưng mình tính thấy rằng DMA có 2k Ram , mình cấp cho độ đệm kênh phải RightBufA=128*2 byte( RightBufA có kiểu int) và RightBufB=128*2 byte(RightBuf có kiểu int), và cũng tương tự cho kênh trái LetBufA, LetBufB, chạy DMA ở chế độ repeat,continue,ping-pong và HALF: Block Transfer Interrupt Select bit =0.
Đọc 512 byte từ thẻ nhớ mất khoảng 3.25ms(thực ra nếu đọc 512 byte đã được canh lề đúng thì chỉ mất 1.42ms , nhưng do khi đọc thực tế thì có thể không canh lề đúng vì dữ liều có thể nằm trên 2 sector khác nhau trong 1 lần đọc 512 byte)512 byte này thì RightBufA hoặc RightBufB lấy 128*2 byte và LetBufA hoặc LetBufB lấy 128*2 byte
và vì tốc độ lấy mẫu là 48Khz => cứ 20.833us lại lấy mẫu một lần, và vì RightBufA hay RightBufB,... là 128 => cứ mỗi 20.833us*128 =2.6667ms DMA kênh 0(cho kênh phải) và kế đó là DMA kênh 1(cho kênh trái) lại ngắt một lần. Tóm lại thì sau 2.6667ms thì CPU phải đẩy dữ liệu vào cho cả 2 kênh.
Vậy là không đủ thời gian =>âm thanh sẽ bị ngắt ngãng, chưa tính đến phải xử lý âm thanh. vậy làm sao để giải quyết đây, bạn có cách nào không.