Đề tài: Nghiên cứu, thiết kế hệ thống phát thanh thông tin qua mạng 3G/4G (P3)

Ở trong các bài viết trước, chúng ta đã tìm hiểu về tệp âm thanh .wav và cách để phát được âm thanh bằng PWM hoặc DAC. Đồng thời, chúng ta cũng đã tìm hiểu cách giao tiếp với thẻ nhớ SD qua giao thức SPI. Để có thể thực hiện được phát âm thanh từ tệp .wav trong thẻ nhớ thì các bạn cần đọc qua hai bài viết đó để có thể dễ dàng thực hiện hơn. Link bài viết các bạn có thể truy cập ở đây:

Phần 1: Phát âm thanh bằng PWM và DAC. Xem tại đây.

Phần 2: Giao tiếp thẻ nhớ SD Card bằng SPI và sử dụng hệ thống FATFS. Xem tại đây

Phần 3. Phát âm thanh từ file .wav trên thẻ nhớ

Tiếp tục với phần 3, mình sẽ hướng dẫn các bạn sử dụng DAC để phát âm thanh. Tệp âm thanh mình sử dụng là .wav 8bit, 16kHz. Tất cả các cấu hình hoàn toàn giống với cấu hình mình đã thực hiện ở hai bài viết trước đó. Các bạn có thể theo dõi kỹ hơn, còn trong bài viết này mình sẽ cấu hình mà không giải thích lại nữa nhé!

Bước 1: Tạo mới project, chọn vi điều khiển bạn sử dụng có DAC. Vào System Core, chọn SYS, chọn Serial Wire.

Bước 2: Ở thẻ Clock Configuration, chọn tần số xung clock HCLK là 72MHz.

Bước 3: Cấu hình DAC, như hình vẽ. Chú ý, bật Timer 6 Trigger Out event.

 Cấu hình bật DMA của DAC.

Bước 4: Cấu hình TIM6, tần số lấy mẫu âm thanh của chúng ta là 16KHz, nên mình sẽ cấu hình Timer 6 như sau:

  • Tích vào Activated
  • Prescaler: 36 – 1
  • Counter Period: 125 – 1
  • Triger Envent Selection chọn Update Event

Bước 5: Cấu hình SPI1 ở chế độ Full-Duplex Master

  • Data Size: 8 bit
  • Prescaler: 16
  • Các thông số còn lại giữ nguyên

Bước 6: Sử dụng chân PB0 làm chân GPIO Output, kết nối với chân CS của module thẻ nhớ.

Bước 7: Vào Middleware, cấu hình FATFS, tick vào ô User-defined.

  • USE_LFN: chọn Enable with static working buffer on the BSS
  • MAX_SS: 4096
  • Còn lại giữ mặc định

Bước 8: Sử dụng nút nhấn PC13 với chức năng ngắt ngoài. Các bạn sử dụng nút nhấn tương ứng trên board của các bạn.

Bước 9: Nhấn vào biểu tượng sinh code.

Bước 10: Các bạn vào Core > Src mở file stm32f3xx_it.c và thêm các phần mã code như sau:

Bước 11: Trong file fatfs_sd.h, các bạn kiểm tra lại chân IO mà các bạn đã khai báo dùng để kết nối với chân CS của module thẻ nhớ đã đúng chưa, nếu chưa đúng thì sửa lại.

Bước 12: Trong file fatfs_sd.c, các bạn thêm thư viện sau tương ứng với vi điều khiển mà bạn đang dùng, nếu bạn dùng F1 hay F4 thì chỉ cần sửa lại là được, ở đây mình sử dụng F3.

OKE! Như vậy là chúng ta đã xong các bước cấu hình và khởi tạo ban đầu cho project. Bây giờ chúng ta sẽ cùng xây dựng một hàm có chức năng phát âm thanh đơn giản nha.

Đầu tiên mình sẽ khai báo một bộ đệm để lưu trữ dữ liệu đọc từ thẻ nhớ. Kích thước bộ đệm mình sẽ định nghĩa nó để dễ dàng sửa đổi. Đồng thời, mình khai báo thêm hai biến để thao tác với tệp.

Và sau đây là hàm dùng để phát âm thanh. Tham số truyền vào là tên của tệp tin với đuôi là .wav (cũng có thể là .txt nếu các bạn đổi định dạng từ .wav sang .txt).

Dữ liệu đọc ra từ thẻ nhớ sẽ được lưu vào bộ đệm buf. Nếu kích thước của tệp nhỏ hơn kích thước bộ đệm thì đọc toàn bộ dữ liệu ra. Nếu kích thước của tệp lớn hơn thì chúng ta phải chia nhỏ ra để đọc, mỗi lần đọc ra số lượng byte sẽ bằng BUF_LEN. Dữ liệu trong bộ đệm sẽ được phát ra bằng DAC (DMA).

Sau mỗi lần phát hết một lượng dữ liệu, phải thực hiện lại quá trình copy lại dữ liệu và phát ra cho đến khi toàn bộ tệp được đọc ra hết. Để làm được, kích thước tệp phải giảm đi bằng cách lấy kích thước tổng trừ đi lượng dữ liệu đã đọc, và vị trí con trỏ đọc phải tăng lên. Cứ như thế dữ liệu sẽ được đọc hết. Sau khi tệp đã được đọc hết và phát hoàn thành, cần phải đặt lại giá trị của con trỏ để lần phát tiếp theo không bị lỗi. Ngoài ra, mình sẽ sử dụng một nút nhấn, để khi nhất nút thì thiết bị bắt đầu phát nhạc.

Mã chương trình:

File main.c

Vậy mình đã hướng dẫn cho các bạn cách đọc file .wav và phát âm thanh từ thẻ nhớ. Đây là đề tài mà nhóm mình khá tâm huyết trong quá trình lên ý tưởng, thực hiện và hoàn thiện sản phẩm. Mình hy những chia sẻ này sẽ mang lại nhiều hữu ích đến các bạn. Chúc các bạn thành công!

Giới thiệu đến các bạn video Demo của nhóm thực tập.

Nếu bạn quan tâm đến các chủ đề liên quan, hãy nhấn like 👍 và subcribe 👇 tại kênh youtube của Cộng đồng kỹ thuật TAPIT để nhận thông báo về những video với các nội dung liên quan nhé!

Nhóm thực tập tại Cộng đồng Kỹ thuật TAPIT

Hoàng Văn Bình, Nguyễn Quang Linh

Tìm hiểu thêm:
Fanpage Cộng đồng Kỹ thuật TAPIT: TAPIT – Learning, Research and Sharing Community