├── en ├── images │ └── .gitkeep ├── book.json ├── README.md ├── BSP.md ├── RTC.md ├── SUMMARY.md ├── WDT.md ├── GPIO.md ├── PWM.md ├── SHA256.md ├── KPU.md ├── GPIOHS.md ├── FFT.md ├── TIMER.md ├── UARTHS.md └── I2C.md ├── zh-Hans ├── images │ └── .gitkeep ├── book.json ├── README.md ├── SHA256.md ├── GPIO.md ├── SUMMARY.md ├── PWM.md ├── WDT.md ├── FFT.md ├── UARTHS.md ├── TIMER.md ├── GPIOHS.md ├── RTC.md ├── BSP.md ├── APU.md ├── I2C.md └── DMAC.md ├── zh-Hant ├── images │ └── .gitkeep ├── book.json ├── README.md ├── RTC.md ├── SHA256.md ├── SUMMARY.md ├── GPIO.md ├── PWM.md ├── WDT.md ├── BSP.md ├── FFT.md ├── UARTHS.md ├── TIMER.md ├── I2C.md ├── GPIOHS.md ├── KPU.md └── DMAC.md ├── .github ├── PULL_REQUEST_TEMPLATE.md └── ISSUE_TEMPLATE.md ├── .travis.yml ├── .markdownlint.json └── README.md /en/images/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /zh-Hans/images/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /zh-Hant/images/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Fixes #\. 2 | 3 | Make sure all boxes are checked (add x inside the brackets) when you submit your contribution, remove this sentence before doing so. 4 | 5 | - [ ] I have thoroughly tested my contribution. 6 | - [ ] The code I submitted has no copyright issues. 7 | 8 | \ -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | sudo: true 4 | 5 | node_js: 6 | - "10" 7 | 8 | cache: npm 9 | 10 | install: 11 | - npm install -g markdownlint-cli 12 | 13 | script: 14 | - markdownlint --config .markdownlint.json -i en/node_modules en/ 15 | - markdownlint --config .markdownlint.json -i zh-Hans/node_modules zh-Hans/ 16 | - markdownlint --config .markdownlint.json -i zh-Hant/node_modules zh-Hant/ 17 | -------------------------------------------------------------------------------- /.markdownlint.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": true, 3 | "whitespace": true, 4 | "line_length": false, 5 | "ul-start-left": true, 6 | "ul-indent": true, 7 | "no-inline-html": false, 8 | "no-bare-urls": true, 9 | "fenced-code-language": true, 10 | "first-line-h1": true, 11 | "no-duplicate-heading":false, 12 | "no-emphasis-as-heading":false, 13 | "single-trailing-newline":false 14 | } 15 | -------------------------------------------------------------------------------- /zh-Hans/book.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "-highlight", 4 | "prism", 5 | "footnote-string-to-number", 6 | "search-pro", 7 | "anchors", 8 | "flow", 9 | "sequence", 10 | "katex-plus", 11 | "echarts" 12 | ], 13 | "pdf": { 14 | "margin": { 15 | "top": 36, 16 | "bottom": 36 17 | }, 18 | "toc": true 19 | }, 20 | "structure": { 21 | "readme": "README.md", 22 | "summary": "SUMMARY.md" 23 | }, 24 | "title": "Kendryte Standalone SDK 编程指南", 25 | "language": "zh-hans" 26 | } 27 | -------------------------------------------------------------------------------- /zh-Hant/book.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "-highlight", 4 | "prism", 5 | "footnote-string-to-number", 6 | "search-pro", 7 | "anchors", 8 | "flow", 9 | "sequence", 10 | "katex-plus", 11 | "echarts" 12 | ], 13 | "pdf": { 14 | "margin": { 15 | "top": 36, 16 | "bottom": 36 17 | }, 18 | "toc": true 19 | }, 20 | "structure": { 21 | "readme": "README.md", 22 | "summary": "SUMMARY.md" 23 | }, 24 | "title": "Kendryte Standalone SDK 编程指南", 25 | "language": "zh-hant" 26 | } 27 | -------------------------------------------------------------------------------- /en/book.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "-highlight", 4 | "prism", 5 | "footnote-string-to-number", 6 | "search-pro", 7 | "anchors", 8 | "flow", 9 | "sequence", 10 | "katex-plus", 11 | "echarts" 12 | ], 13 | "pdf": { 14 | "margin": { 15 | "top": 36, 16 | "bottom": 36 17 | }, 18 | "toc": true 19 | }, 20 | "structure": { 21 | "readme": "README.md", 22 | "summary": "SUMMARY.md" 23 | }, 24 | "title": "Kendryte Standalone SDK Programming Guide", 25 | "language": "en" 26 | } 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KENDRYTE DOCUMENT PROJECT 2 | 3 | [![Build Status](https://travis-ci.org/kendryte/kendryte-doc-standalone-programming-guide.svg)](https://travis-ci.org/kendryte/kendryte-doc-standalone-programming-guide) 4 | 5 | ## How to build 6 | 7 | Install gitbook. 8 | 9 | ```bash 10 | npm install gitbook-cli -g 11 | ``` 12 | 13 | Clone this project. 14 | 15 | ```bash 16 | git clone https://github.com/kendryte/kendryte-doc-standalone-programming-guide.git 17 | ``` 18 | 19 | Build this project and view it in web browser, ``$LANG`` is your current language. 20 | 21 | | \$LANG | DESCRIPTION | 22 | | ------- | ----------- | 23 | | en | English | 24 | | zh-Hans | 简体中文 | 25 | | zh-Hant | 繁體中文 | 26 | 27 | ```bash 28 | cd kendryte-doc-ds/$LANG 29 | gitbook install 30 | gitbook serve 31 | ``` 32 | -------------------------------------------------------------------------------- /zh-Hant/README.md: -------------------------------------------------------------------------------- 1 | # 關於本手冊 2 | 3 | 本文檔為用戶提供基於 Kendryte K210 Standalone SDK 開發時的編程指南. 4 | 5 | ## 對應SDK版本 6 | 7 | Kendryte Standalone SDK v0.5.3 (*7ba017918e595714eeeb92ce5695db90e59b8950*) 8 | 9 | ## 發佈說明 10 | 11 | | 日期 | 版本 | 發佈說明 | 12 | | ---------- | ------ | ------------------------- | 13 | | 2018-10-10 | V0.1.0 | 初始版本 | 14 | | 2018-10-20 | V0.2.0 | 發佈對應 Standalone SDK v0.4.0 的文檔 | 15 | | 2018-11-02 | V0.3.0 | 發佈對應 Standalone SDK v0.5.1 的文檔 | 16 | | 2019-01-11 | V0.4.0 | 發佈對應 Standalone SDK v0.5.3 的文檔 | 17 | 18 | ## 免責聲明 19 | 20 | 本文中的資訊,包括參考的 URL 地址,如有變更,恕不另行通知。文檔“按現狀”提供,不負任何擔保責任,包 21 | 括對適銷性、適用於特定用途或非侵權性的任何擔保,和任何提案、規格或樣品在他處提到的任何擔保。 22 | 本文檔不負任何責任,包括使用本文檔內資訊產生的侵犯任何專利權行為的責任。本文檔在此未以禁止反言或 23 | 其他方式授予任何知識產權使用許可,不管是明示許可還是暗示許可。 24 | 文中提到的所有商標名稱、商標和註冊商標均屬其各自所有者的財產,特此聲明。 25 | 26 | ## 版權公告 27 | 28 | 版權歸 © 2018 嘉楠科技所有。保留所有權利。 29 | -------------------------------------------------------------------------------- /zh-Hans/README.md: -------------------------------------------------------------------------------- 1 | # 关于本手册 2 | 3 | 本文档为用户提供基于 Kendryte K210 Standalone SDK 开发时的编程指南. 4 | 5 | ## 对应SDK版本 6 | 7 | Kendryte Standalone SDK v0.5.6 (*9410af7ca0077563bce9523dd2dab56ad2b8c243*) 8 | 9 | ## 发布说明 10 | 11 | | 日期 | 版本 | 发布说明 | 12 | | ---------- | ------ | ------------------------- | 13 | | 2018-10-10 | V0.1.0 | 初始版本 | 14 | | 2018-10-20 | V0.2.0 | 发布对应 Standalone SDK v0.4.0 的文档 | 15 | | 2018-11-02 | V0.3.0 | 发布对应 Standalone SDK v0.5.1 的文档 | 16 | | 2019-01-11 | V0.4.0 | 发布对应 Standalone SDK v0.5.3 的文档 | 17 | | 2019-05-17 | V0.5.0 | 发布对应 Standalone SDK v0.5.6 的文档 | 18 | 19 | ## 免责声明 20 | 21 | 本文中的信息,包括参考的 URL 地址,如有变更,恕不另行通知。文档“按现状”提供,不负任何担保责任,包 22 | 括对适销性、适用于特定用途或非侵权性的任何担保,和任何提案、规格或样品在他处提到的任何担保。 23 | 本文档不负任何责任,包括使用本文档内信息产生的侵犯任何专利权行为的责任。本文档在此未以禁止反言或 24 | 其他方式授予任何知识产权使用许可,不管是明示许可还是暗示许可。 25 | 文中提到的所有商标名称、商标和注册商标均属其各自所有者的财产,特此声明。 26 | 27 | ## 版权公告 28 | 29 | 版权归 © 2019 嘉楠科技所有。保留所有权利。 30 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Make sure you read and understand this document. 2 | Use one of the two templates below and delete the rest. 3 | 4 | - [ ] BUG REPORT 5 | - [ ] FEATURE REQUEST 6 | 7 | ------------------------------------------------------------------------------- 8 | > BUG REPORT 9 | 10 | ### Expected behavior 11 | 12 | ### Actual behavior 13 | 14 | ### Test code 15 | 16 | Provide a [Minimal, Complete, and Verifiable example](http://stackoverflow.com/help/mcve) which will reproduce the problem. 17 | 18 | ```bash 19 | # Add code here 20 | ``` 21 | 22 | ### Document version 23 | 24 | Which branch are you on? If you know the Git revision then add it here as well. 25 | 26 | ### Hardware 27 | 28 | Which hardware do you use? 29 | 30 | ### System 31 | 32 | What system do you use? 33 | 34 | ------------------------------------------------------------------------------- 35 | > FEATURE REQUEST 36 | 37 | ### Missing feature 38 | 39 | ### Justification 40 | 41 | Tell us why you would like to see this feature added. 42 | 43 | ### Workarounds 44 | 45 | Are there any workarounds you currently have in place because the feature is missing? 46 | -------------------------------------------------------------------------------- /en/README.md: -------------------------------------------------------------------------------- 1 | # About This Guide 2 | 3 | This document provides the programming guide of Kendryte K210 Standalone SDK. 4 | 5 | ## Corresponding SDK version 6 | 7 | Kendryte Standalone SDK v0.5.1 (*414021b7378f7a56babb5ec02666e3cc03af59fc*) 8 | 9 | ## Revision History 10 | 11 | | Date | Ver. | Revision History | 12 | | ---------- | ------ | ------------------------------------------------ | 13 | | 2018-10-10 | V0.1.0 | Initial release | 14 | | 2018-10-20 | V0.2.0 | Released Standalone SDK v0.4.0 documentation | 15 | | 2018-11-02 | V0.3.0 | Released Standalone SDK v0.5.1 documentation | 16 | 17 | ## Disclaimer 18 | 19 | Information in this document, including URL references, is subject to change without notice. THIS DOCUMENT IS PROVIDED AS IS WITH NO WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY, NON-INFRINGEMENT, FITNESS FOR ANY PARTICULAR PURPOSE, OR ANY WARRANTY OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE. 20 | 21 | All liability, including liability for infringement of any proprietary rights, relating to use of information in this document is disclaimed. No licenses express or implied, by estoppel or otherwise, to any intellectual property rights are granted herein. 22 | 23 | All trade names, trademarks and registered trademarks mentioned in this document are property of their respective owners, and are hereby acknowledged. 24 | 25 | ## Copyright Notice 26 | 27 | Copyright © 2018 Canaan Inc. All rights reserved. -------------------------------------------------------------------------------- /zh-Hant/RTC.md: -------------------------------------------------------------------------------- 1 | # 實時時脈(RTC) 2 | 3 | ## 概述 4 | 5 | RTC是用來計時的單元,在設置時間後具備計時功能。 6 | **註意** RTC模組僅當 PLL0 啟動,並且 CPU 頻率大於 30MHz 時使用 7 | 8 | ## 功能描述 9 | 10 | RTC 模組具有以下功能: 11 | 12 | - 獲取當前日期時刻 13 | - 設置當前日期時刻 14 | 15 | ## API參考 16 | 17 | 對應的頭文件 `rtc.h` 18 | 19 | 為用戶提供以下介面 20 | 21 | - rtc\_init 22 | 23 | - rtc\_timer\_set 24 | 25 | - rtc\_timer\_get 26 | 27 | ### rtc\_init 28 | 29 | #### 描述 30 | 31 | 初始化RTC。 32 | 33 | #### 函數原型 34 | 35 | ```c 36 | int rtc_init(void) 37 | ``` 38 | 39 | #### 參數 40 | 41 | 無。 42 | 43 | #### 返回值 44 | 45 | | 返回值 | 描述 | 46 | | :---- | :----| 47 | | 0 | 成功 | 48 | | 非0 | 失敗 | 49 | 50 | ### rtc\_timer\_set 51 | 52 | #### 描述 53 | 54 | 設置日期時間。 55 | 56 | #### 函數原型 57 | 58 | ```c 59 | int rtc_timer_set(int year, int month, int day, int hour, int minute, int second) 60 | ``` 61 | 62 | #### 參數 63 | 64 | | 參數名稱 | 描述 | 輸入輸出 | 65 | | :-------- | :--------- | :-------- | 66 | | year | 年 | 輸入 | 67 | | month | 月 | 輸入 | 68 | | day | 日 | 輸入 | 69 | | hour | 時 | 輸入 | 70 | | minute | 分 | 輸入 | 71 | | second | 秒 | 輸入 | 72 | 73 | #### 返回值 74 | 75 | 無 76 | 77 | ### rtc\_timer\_get 78 | 79 | #### 描述 80 | 81 | 獲取日期時間。 82 | 83 | #### 函數原型 84 | 85 | ```c 86 | int rtc_timer_get(int *year, int *month, int *day, int *hour, int *minute, int *second) 87 | ``` 88 | 89 | #### 參數 90 | 91 | | 參數名稱 | 描述 | 輸入輸出 | 92 | | :-------- | :--------- | :-------- | 93 | | year | 年 | 輸出 | 94 | | month | 月 | 輸出 | 95 | | day | 日 | 輸出 | 96 | | hour | 時 | 輸出 | 97 | | minute | 分 | 輸出 | 98 | | second | 秒 | 輸出 | 99 | 100 | #### 返回值 101 | 102 | | 返回值 | 描述 | 103 | | :---- | :----| 104 | | 0 | 成功 | 105 | | 非0 | 失敗 | 106 | 107 | ### 舉例 108 | 109 | ```c 110 | rtc_init(); 111 | rtc_timer_set(2018, 9, 12, 23, 30, 29); 112 | int year; 113 | int month; 114 | int day; 115 | int hour; 116 | int minute; 117 | int second; 118 | rtc_timer_get(&year, &month, &day, &hour, &minute, &second); 119 | printf("%4d-%d-%d %d:%d:%d\n", year, month, day, hour, minute, second); 120 | ``` -------------------------------------------------------------------------------- /en/BSP.md: -------------------------------------------------------------------------------- 1 | # Architecture support package(BSP) 2 | 3 | ## Overview 4 | 5 | Architecture level support function of k210 SoC. 6 | 7 | ## Features 8 | 9 | Provides an interface to get the CPU core ID of the currently running program 10 | and an entry to start the second core. 11 | 12 | ## API 13 | 14 | Corresponding header file `bsp.h` 15 | 16 | Provide the following interfaces 17 | 18 | - register\_core1 19 | 20 | - current\_coreid 21 | 22 | ### register\_core1 23 | 24 | #### Description 25 | 26 | Register the function with core 1 and start core 1. 27 | 28 | #### Function prototype 29 | 30 | ```c 31 | int register_core1(core_function func, void *ctx) 32 | ``` 33 | 34 | #### Parameter 35 | 36 | | Parameter name | Description | Input or output | 37 | | -------------- | --------------------------------------------------------- | --------------- | 38 | | func | Function registered to core 1 | Input | 39 | | ctx | The parameter of the function, set to NULL means not used | Input | 40 | 41 | #### Return value 42 | 43 | | Return value | Description | 44 | | :----------- | :---------- | 45 | | 0 | Success | 46 | | Other | Fail | 47 | 48 | ### current\_coreid 49 | 50 | #### Description 51 | 52 | Get the current CPU core ID. 53 | 54 | #### Function prototype 55 | 56 | ```c 57 | #define current_coreid() read_csr(mhartid) 58 | ``` 59 | 60 | #### Parameter 61 | 62 | None. 63 | 64 | #### Return value 65 | 66 | The ID of the current CPU core. 67 | 68 | ### Example 69 | 70 | ```c 71 | /* Core 0 gets the CPU core ID and prints Hello world, then starts core 1 to get the CPU core ID and prints Hello world */ 72 | #include 73 | #include "bsp.h" 74 | 75 | int core1_function(void *ctx) 76 | { 77 | uint64_t core = current_coreid(); 78 | printf("Core %ld Hello world\n", core); 79 | while(1); 80 | } 81 | 82 | int main() 83 | { 84 | uint64_t core = current_coreid(); 85 | printf("Core %ld Hello world\n", core); 86 | register_core1(core1_function, NULL); 87 | while(1); 88 | } 89 | ``` 90 | 91 | ## Data type 92 | 93 | The relevant data types and data structures are defined as follows: 94 | 95 | - core\_function: The function called by the CPU core. 96 | 97 | ### core\_function 98 | 99 | #### Description 100 | 101 | The function called by the CPU core. 102 | 103 | #### Type definition 104 | 105 | ```c 106 | typedef int (*core_function)(void *ctx); 107 | ``` 108 | -------------------------------------------------------------------------------- /en/RTC.md: -------------------------------------------------------------------------------- 1 | # RTC 2 | 3 | ## Overview 4 | 5 | The Real Time Clock (RTC) is a unit for timing and has a timing function after 6 | the set time. 7 | 8 | **Note** The RTC unit is only used when PLL0 is enabled and the CPU frequency is greater than 30MHz. 9 | 10 | ## Features 11 | 12 | The RTC unit has the following features: 13 | 14 | - Get current date and time 15 | - Set the current date and time 16 | - Set timing interrupt 17 | - Set alarm interrupt 18 | 19 | ## API 20 | 21 | Corresponding header file `rtc.h` 22 | 23 | Provide the following interfaces 24 | 25 | - rtc\_init 26 | 27 | - rtc\_timer\_set 28 | 29 | - rtc\_timer\_get 30 | 31 | ### rtc\_init 32 | 33 | #### Description 34 | 35 | Initialize the RTC. 36 | 37 | #### Function prototype 38 | 39 | ```c 40 | int rtc_init(void) 41 | ``` 42 | 43 | #### Parameter 44 | 45 | None. 46 | 47 | #### Return value 48 | 49 | | Return value | Description | 50 | | :----------- | :---------- | 51 | | 0 | Success | 52 | | Others | Fail | 53 | 54 | ### rtc\_timer\_set 55 | 56 | #### Description 57 | 58 | Set the RTC date and time. 59 | 60 | #### Function prototype 61 | 62 | ```c 63 | int rtc_timer_set(int year, int month, int day, int hour, int minute, int second) 64 | ``` 65 | 66 | #### Parameter 67 | 68 | | Parameter name | Description | Input or output | 69 | | :------------- | :---------- | :-------------- | 70 | | year | Year | Input | 71 | | month | Month | Input | 72 | | day | Day | Input | 73 | | hour | Hour | Input | 74 | | minute | Minute | Input | 75 | | second | Second | Input | 76 | 77 | #### Return value 78 | 79 | None. 80 | 81 | ### rtc\_timer\_get 82 | 83 | #### Description 84 | 85 | Get the RTC date and time. 86 | 87 | #### Function prototype 88 | 89 | ```c 90 | int rtc_timer_get(int *year, int *month, int *day, int *hour, int *minute, int *second) 91 | ``` 92 | 93 | #### Parameter 94 | 95 | | Parameter name | Description | Input or output | 96 | | :------------- | :---------- | :-------------- | 97 | | year | Year | Output | 98 | | month | Month | Output | 99 | | day | Day | Output | 100 | | hour | Hour | Output | 101 | | minute | Minute | Output | 102 | | second | Second | Output | 103 | 104 | #### Return value 105 | 106 | | Return value | Description | 107 | | :----------- | :---------- | 108 | | 0 | Success | 109 | | Others | Fail | 110 | 111 | ### Example 112 | 113 | ```c 114 | rtc_init(); 115 | rtc_timer_set(2018, 9, 12, 23, 30, 29); 116 | int year; 117 | int month; 118 | int day; 119 | int hour; 120 | int minute; 121 | int second; 122 | rtc_timer_get(&year, &month, &day, &hour, &minute, &second); 123 | printf("%4d-%d-%d %d:%d:%d\n", year, month, day, hour, minute, second); 124 | ``` -------------------------------------------------------------------------------- /zh-Hans/SHA256.md: -------------------------------------------------------------------------------- 1 | # 安全散列算法加速器(SHA256) 2 | 3 | ## 功能描述 4 | 5 | - 支持 SHA-256 的计算 6 | 7 | ## API参考 8 | 9 | 对应的头文件 `sha256.h` 10 | 11 | 为用户提供以下接口 12 | 13 | - sha256\_init 14 | - sha256\_update 15 | - sha256\_final 16 | - sha256\_hard\_calculate 17 | 18 | ### sha256\_init 19 | 20 | #### 描述 21 | 22 | 初始化 SHA256 加速器外设. 23 | 24 | #### 函数原型 25 | 26 | ```c 27 | void sha256_init(sha256_context_t *context, size_t input_len) 28 | ``` 29 | 30 | #### 参数 31 | 32 | | 参数名称 | 描述 | 输入输出 | 33 | | :----------- | :-------------------- | :--------- | 34 | | context | SHA256的上下文对象 | 输入 | 35 | | input\_len | 待计算SHA256 hash的消息的长度 | 输入 | 36 | 37 | #### 返回值 38 | 39 | 无。 40 | 41 | ### 举例 42 | 43 | ```c 44 | sha256_context_t context; 45 | sha256_init(&context, 128U); 46 | ``` 47 | 48 | ### sha256\_update 49 | 50 | #### 描述 51 | 52 | 传入一个数据块参与SHA256 Hash计算 53 | 54 | #### 函数原型 55 | 56 | ```c 57 | void sha256_update(sha256_context_t *context, const void *input, size_t input_len) 58 | ``` 59 | 60 | #### 参数 61 | 62 | | 参数名称 | 描述 | 输入输出 | 63 | | :----------- | :-------------------- | :--------- | 64 | | context | SHA256的上下文对象 | 输入 | 65 | | input | 待加入计算的SHA256计算的数据块| 输入 | 66 | | buf\_len | 待加入计算的SHA256计算数据块的长度 | 输入 | 67 | 68 | #### 返回值 69 | 70 | 无。 71 | 72 | ### sha256\_final 73 | 74 | #### 描述 75 | 76 | 结束对数据的 SHA256 Hash 计算 77 | 78 | #### 函数原型 79 | 80 | ```c 81 | void sha256_final(sha256_context_t *context, uint8_t *output) 82 | ``` 83 | 84 | #### 参数 85 | 86 | | 参数名称 | 描述 | 输入输出 | 87 | | :----------- | :-------------------- | :--------- | 88 | | context | SHA256的上下文对象 | 输入 | 89 | | output |存放SHA256计算的结果,需保证传入这个buffer的大小为32Bytes以上| 输出| 90 | 91 | #### 返回值 92 | 93 | 无。 94 | 95 | ### sha256\_hard\_calculate 96 | 97 | #### 描述 98 | 99 | 一次性对连续的数据计算它的 SHA256 Hash 100 | 101 | #### 函数原型 102 | 103 | ```c 104 | void sha256_hard_calculate(const uint8_t *input, size_t input_len, uint8_t *output) 105 | ``` 106 | 107 | #### 参数 108 | 109 | | 参数名称 | 描述 | 输入输出 | 110 | | :----------- | :-------------------- | :--------- | 111 | | input | 待SHA256计算的数据 | 输入 | 112 | | input\_len | 待SHA256计算数据的长度 | 输入 | 113 | | output |存放SHA256计算的结果,需保证传入这个buffer的大小为32Bytes以上| 输出| 114 | 115 | #### 返回值 116 | 117 | 无。 118 | 119 | ### 举例 120 | 121 | ```c 122 | uint8_t hash[32]; 123 | sha256_hard_calculate((uint8_t *)"abc", 3, hash); 124 | ``` 125 | 126 | ## 例程 127 | 128 | ### 进行一次计算 129 | 130 | ```c 131 | sha256_context_t context; 132 | sha256_init(&context, input_len); 133 | sha256_update(&context, input, input_len); 134 | sha256_final(&context, output); 135 | ``` 136 | 137 | 或者可以直接调用 `sha256_hard_calculate` 函数 138 | 139 | ```c 140 | sha256_hard_calculate(input, input_len, output); 141 | ``` 142 | 143 | ### 进行分块计算 144 | 145 | ```c 146 | sha256_context_t context; 147 | sha256_init(&context, input_piece1_len + input_piece2_len); 148 | sha256_update(&context, input_piece1, input_piece1_len); 149 | sha256_update(&context, input_piece2, input_piece2_len); 150 | sha256_final(&context, output); 151 | ``` -------------------------------------------------------------------------------- /zh-Hant/SHA256.md: -------------------------------------------------------------------------------- 1 | # 安全散列演算法加速器(SHA256) 2 | 3 | ## 功能描述 4 | 5 | - 支持 SHA-256 的計算 6 | 7 | ## API參考 8 | 9 | 對應的頭文件 `sha256.h` 10 | 11 | 為用戶提供以下介面 12 | 13 | - sha256\_init 14 | - sha256\_update 15 | - sha256\_final 16 | - sha256\_hard\_calculate 17 | 18 | ### sha256\_init 19 | 20 | #### 描述 21 | 22 | 初始化 SHA256 加速器外部裝置. 23 | 24 | #### 函數原型 25 | 26 | ```c 27 | void sha256_init(sha256_context_t *context, size_t input_len) 28 | ``` 29 | 30 | #### 參數 31 | 32 | | 參數名稱 | 描述 | 輸入輸出 | 33 | | :----------- | :-------------------- | :--------- | 34 | | context | SHA256的上下文對象 | 輸入 | 35 | | input\_len | 待計算SHA256 hash的資訊的長度 | 輸入 | 36 | 37 | #### 返回值 38 | 39 | 無。 40 | 41 | ### 舉例 42 | 43 | ```c 44 | sha256_context_t context; 45 | sha256_init(&context, 128U); 46 | ``` 47 | 48 | ### sha256\_update 49 | 50 | #### 描述 51 | 52 | 傳入一個資料塊參與SHA256 Hash計算 53 | 54 | #### 函數原型 55 | 56 | ```c 57 | void sha256_update(sha256_context_t *context, const void *input, size_t input_len) 58 | ``` 59 | 60 | #### 參數 61 | 62 | | 參數名稱 | 描述 | 輸入輸出 | 63 | | :----------- | :-------------------- | :--------- | 64 | | context | SHA256的上下文對象 | 輸入 | 65 | | input | 待加入計算的SHA256計算的資料塊| 輸入 | 66 | | buf\_len | 待加入計算的SHA256計算資料塊的長度 | 輸入 | 67 | 68 | #### 返回值 69 | 70 | 無。 71 | 72 | ### sha256\_final 73 | 74 | #### 描述 75 | 76 | 結束對資料的 SHA256 Hash 計算 77 | 78 | #### 函數原型 79 | 80 | ```c 81 | void sha256_final(sha256_context_t *context, uint8_t *output) 82 | ``` 83 | 84 | #### 參數 85 | 86 | | 參數名稱 | 描述 | 輸入輸出 | 87 | | :----------- | :-------------------- | :--------- | 88 | | context | SHA256的上下文對象 | 輸入 | 89 | | output |存放SHA256計算的結果,需保證傳入這個buffer的大小為32Bytes以上| 輸出| 90 | 91 | #### 返回值 92 | 93 | 無。 94 | 95 | ### sha256\_hard\_calculate 96 | 97 | #### 描述 98 | 99 | 一次性對連續的資料計算它的 SHA256 Hash 100 | 101 | #### 函數原型 102 | 103 | ```c 104 | void sha256_hard_calculate(const uint8_t *input, size_t input_len, uint8_t *output) 105 | ``` 106 | 107 | #### 參數 108 | 109 | | 參數名稱 | 描述 | 輸入輸出 | 110 | | :----------- | :-------------------- | :--------- | 111 | | input | 待SHA256計算的資料 | 輸入 | 112 | | input\_len | 待SHA256計算資料的長度 | 輸入 | 113 | | output |存放SHA256計算的結果,需保證傳入這個buffer的大小為32Bytes以上| 輸出| 114 | 115 | #### 返回值 116 | 117 | 無。 118 | 119 | ### 舉例 120 | 121 | ```c 122 | uint8_t hash[32]; 123 | sha256_hard_calculate((uint8_t *)"abc", 3, hash); 124 | ``` 125 | 126 | ## 常式 127 | 128 | ### 進行一次計算 129 | 130 | ```c 131 | sha256_context_t context; 132 | sha256_init(&context, input_len); 133 | sha256_update(&context, input, input_len); 134 | sha256_final(&context, output); 135 | ``` 136 | 137 | 或者可以直接調用 `sha256_hard_calculate` 函數 138 | 139 | ```c 140 | sha256_hard_calculate(input, input_len, output); 141 | ``` 142 | 143 | ### 進行分塊計算 144 | 145 | ```c 146 | sha256_context_t context; 147 | sha256_init(&context, input_piece1_len + input_piece2_len); 148 | sha256_update(&context, input_piece1, input_piece1_len); 149 | sha256_update(&context, input_piece2, input_piece2_len); 150 | sha256_final(&context, output); 151 | ``` -------------------------------------------------------------------------------- /zh-Hant/SUMMARY.md: -------------------------------------------------------------------------------- 1 | # 目錄 2 | 3 | - [神經網路處理器 (KPU)](KPU.md) 4 | - [概述](KPU.md#概述) 5 | - [功能描述](KPU.md#功能描述) 6 | - [API參考](KPU.md#API參考) 7 | - [資料類型](KPU.md#資料類型) 8 | 9 | - [高級加密加速器(AES)](AES.md) 10 | - [功能描述](AES.md#功能描述) 11 | - [API參考](AES.md#API參考) 12 | - [資料類型](AES.md#資料類型) 13 | 14 | - [外部中斷(INTERRUPT)](INTERRUPT.md) 15 | - [概述](INTERRUPT.md#概述) 16 | - [功能描述](INTERRUPT.md#功能描述) 17 | - [API參考](INTERRUPT.md#API參考) 18 | - [資料類型](INTERRUPT.md#資料類型) 19 | 20 | - [通用輸入/輸出 (GPIO)](GPIO.md) 21 | - [概述](GPIO.md#概述) 22 | - [功能描述](GPIO.md#功能描述) 23 | - [API參考](GPIO.md#API參考) 24 | - [資料類型](GPIO.md#資料類型) 25 | 26 | - [高速通用輸入/輸出 (GPIOHS)](GPIOHS.md) 27 | - [概述](GPIOHS.md#概述) 28 | - [功能描述](GPIOHS.md#功能描述) 29 | - [API參考](GPIOHS.md#API參考) 30 | - [資料類型](GPIOHS.md#資料類型) 31 | 32 | - [現場可編程IO陣列(FPIOA)](FPIOA.md) 33 | - [概述](FPIOA.md#概述) 34 | - [功能描述](FPIOA.md#功能描述) 35 | - [API參考](FPIOA.md#API參考) 36 | - [資料類型](FPIOA.md#資料類型) 37 | 38 | - [數位攝像頭介面 (DVP)](DVP.md) 39 | - [概述](DVP.md#概述) 40 | - [功能描述](DVP.md#功能描述) 41 | - [API參考](DVP.md#API參考) 42 | - [資料類型](DVP.md#資料類型) 43 | 44 | - [快速傅立葉變換加速器(FFT)](FFT.md) 45 | - [概述](FFT.md#概述) 46 | - [功能描述](FFT.md#功能描述) 47 | - [API參考](FFT.md#API參考) 48 | - [資料類型](FFT.md#資料類型) 49 | 50 | - [安全散列演算法加速器(SHA256)](SHA256.md) 51 | - [功能描述](SHA256.md#功能描述) 52 | - [API參考](SHA256.md#API參考) 53 | 54 | - [通用非同步收發傳輸器 (UART)](UART.md) 55 | - [概述](UART.md#概述) 56 | - [功能描述](UART.md#功能描述) 57 | - [API參考](UART.md#API參考) 58 | - [資料類型](UART.md#資料類型) 59 | 60 | - [高速通用非同步收發傳輸器 (UARTHS)](UARTHS.md) 61 | - [概述](UARTHS.md#概述) 62 | - [功能描述](UARTHS.md#功能描述) 63 | - [API參考](UARTHS.md#API參考) 64 | - [資料類型](UARTHS.md#資料類型) 65 | 66 | - [看門狗定時器 (WDT)](WDT.md) 67 | - [概述](WDT.md#概述) 68 | - [功能描述](WDT.md#功能描述) 69 | - [API參考](WDT.md#API參考) 70 | - [資料類型](WDT.md#資料類型) 71 | 72 | - [直接內部儲存存取控制器(DMAC)](DMAC.md) 73 | - [概述](DMAC.md#概述) 74 | - [功能描述](DMAC.md#功能描述) 75 | - [API參考](DMAC.md#API參考) 76 | - [資料類型](DMAC.md#資料類型) 77 | 78 | - [集成電路內置匯流排(I2C)](I2C.md) 79 | - [概述](I2C.md#概述) 80 | - [功能描述](I2C.md#功能描述) 81 | - [API參考](I2C.md#API參考) 82 | - [資料類型](I2C.md#資料類型) 83 | 84 | - [串列外部裝置介面(SPI)](SPI.md) 85 | - [概述](SPI.md#概述) 86 | - [功能描述](SPI.md#功能描述) 87 | - [API參考](SPI.md#API參考) 88 | - [資料類型](SPI.md#資料類型) 89 | 90 | - [集成電路內置音頻匯流排 (I2S)](I2S.md) 91 | - [概述](I2S.md#概述) 92 | - [功能描述](I2S.md#功能描述) 93 | - [API參考](I2S.md#API參考) 94 | - [資料類型](I2S.md#資料類型) 95 | 96 | - [定時器 (TIMER)](TIMER.md) 97 | - [概述](TIMER.md#概述) 98 | - [功能描述](TIMER.md#功能描述) 99 | - [API參考](TIMER.md#API參考) 100 | - [資料類型](TIMER.md#資料類型) 101 | 102 | - [實時時脈(RTC)](RTC.md) 103 | - [概述](RTC.md#概述) 104 | - [功能描述](RTC.md#功能描述) 105 | - [API參考](FFT.md#API參考) 106 | 107 | - [脈衝寬度調製器(PWM)](PWM.md) 108 | - [概述](PWM.md#概述) 109 | - [功能描述](PWM.md#功能描述) 110 | - [API參考](PWM.md#API參考) 111 | - [資料類型](PWM.md#資料類型) 112 | 113 | - [系統控制](SYSCTL.md) 114 | - [概述](SYSCTL.md#概述) 115 | - [功能描述](SYSCTL.md#功能描述) 116 | - [API參考](SYSCTL.md#API參考) 117 | - [資料類型](SYSCTL.md#資料類型) 118 | 119 | - [平臺相關(BSP)](BSP.md) 120 | - [概述](BSP.md#概述) 121 | - [功能描述](BSP.md#功能描述) 122 | - [API參考](BSP.md#API參考) 123 | - [資料類型](BSP.md#資料類型) -------------------------------------------------------------------------------- /zh-Hans/GPIO.md: -------------------------------------------------------------------------------- 1 | # 通用输入/输出 (GPIO) 2 | 3 | ## 概述 4 | 5 | 芯片有8个通用GPIO。 6 | 7 | ## 功能描述 8 | 9 | GPIO 模块具有以下功能: 10 | 11 | - 可配置上下拉驱动模式 12 | 13 | ## API 参考 14 | 15 | 对应的头文件 `gpio.h` 16 | 17 | 为用户提供以下接口 18 | 19 | - gpio\_init 20 | 21 | - gpio\_set\_drive\_mode 22 | 23 | - gpio\_set\_pin 24 | 25 | - gpio\_get\_pin 26 | 27 | ### gpio\_init 28 | 29 | #### 描述 30 | 31 | 初始化GPIO。 32 | 33 | #### 函数原型 34 | 35 | ```c 36 | int gpio_init(void) 37 | ``` 38 | 39 | #### 返回值 40 | 41 | | 返回值 | 描述 | 42 | | :---- | :----| 43 | | 0 | 成功 | 44 | | 非0 | 失败 | 45 | 46 | ### gpio\_set\_drive\_mode 47 | 48 | #### 描述 49 | 50 | 设置GPIO驱动模式。 51 | 52 | #### 函数原型 53 | 54 | ```c 55 | void gpio_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode) 56 | ``` 57 | 58 | #### 参数 59 | 60 | | 参数名称 | 描述 | 输入输出 | 61 | | :------------ | :------------- | :-------- | 62 | | pin | GPIO管脚 | 输入 | 63 | | mode | GPIO驱动模式 | 输入 | 64 | 65 | #### 返回值 66 | 67 | 无。 68 | 69 | ### gpio\_set\_pin 70 | 71 | #### 描述 72 | 73 | 设置GPIO管脚值。 74 | 75 | #### 函数原型 76 | 77 | ```c 78 | void gpio_set_pin(uint8_t pin, gpio_pin_value_t value) 79 | ``` 80 | 81 | #### 参数 82 | 83 | | 参数名称 | 描述 | 输入输出 | 84 | | :------------ | :------------- | :-------- | 85 | | pin | GPIO管脚 | 输入 | 86 | | value | GPIO值 | 输入 | 87 | 88 | #### 返回值 89 | 90 | 无。 91 | 92 | ### gpio\_get\_pin 93 | 94 | #### 描述 95 | 96 | 获取GPIO管脚值。 97 | 98 | #### 函数原型 99 | 100 | ```c 101 | gpio_pin_value_t gpio_get_pin(uint8_t pin) 102 | ``` 103 | 104 | #### 参数 105 | 106 | | 参数名称 | 描述 | 输入输出 | 107 | | :------------ | :------------- | :-------- | 108 | | pin | GPIO管脚 | 输入 | 109 | 110 | #### 返回值 111 | 112 | 获取的GPIO管脚值。 113 | 114 | ### 举例 115 | 116 | ```c 117 | /* 设置IO13为输出并置为高 */ 118 | gpio_init(); 119 | fpioa_set_function(13, FUNC_GPIO3); 120 | gpio_set_drive_mode(3, GPIO_DM_OUTPUT); 121 | gpio_set_pin(3, GPIO_PV_High); 122 | ``` 123 | 124 | ## 数据类型 125 | 126 | 相关数据类型、数据结构定义如下: 127 | 128 | - gpio\_drive\_mode\_t:GPIO驱动模式。 129 | 130 | - gpio\_pin\_value\_t:GPIO值。 131 | 132 | ### gpio\_drive\_mode\_t 133 | 134 | #### 描述 135 | 136 | GPIO驱动模式。 137 | 138 | #### 定义 139 | 140 | ```c 141 | typedef enum _gpio_drive_mode 142 | { 143 | GPIO_DM_INPUT, 144 | GPIO_DM_INPUT_PULL_DOWN, 145 | GPIO_DM_INPUT_PULL_UP, 146 | GPIO_DM_OUTPUT, 147 | } gpio_drive_mode_t; 148 | ``` 149 | 150 | #### 成员 151 | 152 | | 成员名称 | 描述 | 153 | | --------------------------- | ----------- | 154 | | GPIO\_DM\_INPUT | 输入 | 155 | | GPIO\_DM\_INPUT\_PULL\_DOWN | 输入下拉 | 156 | | GPIO\_DM\_INPUT\_PULL\_UP | 输入上拉 | 157 | | GPIO\_DM\_OUTPUT | 输出 | 158 | 159 | ### gpio\_pin\_value\_t 160 | 161 | #### 描述 162 | 163 | GPIO 值。 164 | 165 | #### 定义 166 | 167 | ```c 168 | typedef enum _gpio_pin_value 169 | { 170 | GPIO_PV_LOW, 171 | GPIO_PV_HIGH 172 | } gpio_pin_value_t; 173 | ``` 174 | 175 | #### 成员 176 | 177 | | 成员名称 | 描述 | 178 | | ------------------ | ----------- | 179 | | GPIO\_PV\_LOW | 低 | 180 | | GPIO\_PV\_HIGH | 高 | -------------------------------------------------------------------------------- /zh-Hant/GPIO.md: -------------------------------------------------------------------------------- 1 | # 通用輸入/輸出 (GPIO) 2 | 3 | ## 概述 4 | 5 | 晶片有8個通用GPIO。 6 | 7 | ## 功能描述 8 | 9 | GPIO 模組具有以下功能: 10 | 11 | - 可配置上下拉驅動模式 12 | 13 | ## API 參考 14 | 15 | 對應的頭文件 `gpio.h` 16 | 17 | 為用戶提供以下介面 18 | 19 | - gpio\_init 20 | 21 | - gpio\_set\_drive\_mode 22 | 23 | - gpio\_set\_pin 24 | 25 | - gpio\_get\_pin 26 | 27 | ### gpio\_init 28 | 29 | #### 描述 30 | 31 | 初始化GPIO。 32 | 33 | #### 函數原型 34 | 35 | ```c 36 | int gpio_init(void) 37 | ``` 38 | 39 | #### 返回值 40 | 41 | | 返回值 | 描述 | 42 | | :---- | :----| 43 | | 0 | 成功 | 44 | | 非0 | 失敗 | 45 | 46 | ### gpio\_set\_drive\_mode 47 | 48 | #### 描述 49 | 50 | 設置GPIO驅動模式。 51 | 52 | #### 函數原型 53 | 54 | ```c 55 | void gpio_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode) 56 | ``` 57 | 58 | #### 參數 59 | 60 | | 參數名稱 | 描述 | 輸入輸出 | 61 | | :------------ | :------------- | :-------- | 62 | | pin | GPIO腳位 | 輸入 | 63 | | mode | GPIO驅動模式 | 輸入 | 64 | 65 | #### 返回值 66 | 67 | 無。 68 | 69 | ### gpio\_set\_pin 70 | 71 | #### 描述 72 | 73 | 設置GPIO腳位值。 74 | 75 | #### 函數原型 76 | 77 | ```c 78 | void gpio_set_pin(uint8_t pin, gpio_pin_value_t value) 79 | ``` 80 | 81 | #### 參數 82 | 83 | | 參數名稱 | 描述 | 輸入輸出 | 84 | | :------------ | :------------- | :-------- | 85 | | pin | GPIO腳位 | 輸入 | 86 | | value | GPIO值 | 輸入 | 87 | 88 | #### 返回值 89 | 90 | 無。 91 | 92 | ### gpio\_get\_pin 93 | 94 | #### 描述 95 | 96 | 獲取GPIO腳位值。 97 | 98 | #### 函數原型 99 | 100 | ```c 101 | gpio_pin_value_t gpio_get_pin(uint8_t pin) 102 | ``` 103 | 104 | #### 參數 105 | 106 | | 參數名稱 | 描述 | 輸入輸出 | 107 | | :------------ | :------------- | :-------- | 108 | | pin | GPIO腳位 | 輸入 | 109 | 110 | #### 返回值 111 | 112 | 獲取的GPIO腳位值。 113 | 114 | ### 舉例 115 | 116 | ```c 117 | /* 設置IO13為輸出並置為高 */ 118 | gpio_init(); 119 | fpioa_set_function(13, FUNC_GPIO3); 120 | gpio_set_drive_mode(3, GPIO_DM_OUTPUT); 121 | gpio_set_pin(3, GPIO_PV_High); 122 | ``` 123 | 124 | ## 資料類型 125 | 126 | 相關資料類型、資料結構定義如下: 127 | 128 | - gpio\_drive\_mode\_t:GPIO驅動模式。 129 | 130 | - gpio\_pin\_value\_t:GPIO值。 131 | 132 | ### gpio\_drive\_mode\_t 133 | 134 | #### 描述 135 | 136 | GPIO驅動模式。 137 | 138 | #### 定義 139 | 140 | ```c 141 | typedef enum _gpio_drive_mode 142 | { 143 | GPIO_DM_INPUT, 144 | GPIO_DM_INPUT_PULL_DOWN, 145 | GPIO_DM_INPUT_PULL_UP, 146 | GPIO_DM_OUTPUT, 147 | } gpio_drive_mode_t; 148 | ``` 149 | 150 | #### 成員 151 | 152 | | 成員名稱 | 描述 | 153 | | --------------------------- | ----------- | 154 | | GPIO\_DM\_INPUT | 輸入 | 155 | | GPIO\_DM\_INPUT\_PULL\_DOWN | 輸入下拉 | 156 | | GPIO\_DM\_INPUT\_PULL\_UP | 輸入上拉 | 157 | | GPIO\_DM\_OUTPUT | 輸出 | 158 | 159 | ### gpio\_pin\_value\_t 160 | 161 | #### 描述 162 | 163 | GPIO 值。 164 | 165 | #### 定義 166 | 167 | ```c 168 | typedef enum _gpio_pin_value 169 | { 170 | GPIO_PV_LOW, 171 | GPIO_PV_HIGH 172 | } gpio_pin_value_t; 173 | ``` 174 | 175 | #### 成員 176 | 177 | | 成員名稱 | 描述 | 178 | | ------------------ | ----------- | 179 | | GPIO\_PV\_LOW | 低 | 180 | | GPIO\_PV\_HIGH | 高 | -------------------------------------------------------------------------------- /zh-Hans/SUMMARY.md: -------------------------------------------------------------------------------- 1 | # 目录 2 | 3 | - [神经网络处理器 (KPU)](KPU.md) 4 | - [概述](KPU.md#概述) 5 | - [功能描述](KPU.md#功能描述) 6 | - [API参考](KPU.md#API参考) 7 | - [数据类型](KPU.md#数据类型) 8 | 9 | - [麦克风阵列处理器 (APU)](APU.md) 10 | - [概述](APU.md#概述) 11 | - [功能描述](APU.md#功能描述) 12 | - [API参考](APU.md#API参考) 13 | - [数据类型](APU.md#数据类型) 14 | 15 | - [高级加密加速器(AES)](AES.md) 16 | - [功能描述](AES.md#功能描述) 17 | - [API参考](AES.md#API参考) 18 | - [数据类型](AES.md#数据类型) 19 | 20 | - [外部中断(INTERRUPT)](INTERRUPT.md) 21 | - [概述](INTERRUPT.md#概述) 22 | - [功能描述](INTERRUPT.md#功能描述) 23 | - [API参考](INTERRUPT.md#API参考) 24 | - [数据类型](INTERRUPT.md#数据类型) 25 | 26 | - [通用输入/输出 (GPIO)](GPIO.md) 27 | - [概述](GPIO.md#概述) 28 | - [功能描述](GPIO.md#功能描述) 29 | - [API参考](GPIO.md#API参考) 30 | - [数据类型](GPIO.md#数据类型) 31 | 32 | - [高速通用输入/输出 (GPIOHS)](GPIOHS.md) 33 | - [概述](GPIOHS.md#概述) 34 | - [功能描述](GPIOHS.md#功能描述) 35 | - [API参考](GPIOHS.md#API参考) 36 | - [数据类型](GPIOHS.md#数据类型) 37 | 38 | - [现场可编程IO阵列(FPIOA)](FPIOA.md) 39 | - [概述](FPIOA.md#概述) 40 | - [功能描述](FPIOA.md#功能描述) 41 | - [API参考](FPIOA.md#API参考) 42 | - [数据类型](FPIOA.md#数据类型) 43 | 44 | - [数字摄像头接口 (DVP)](DVP.md) 45 | - [概述](DVP.md#概述) 46 | - [功能描述](DVP.md#功能描述) 47 | - [API参考](DVP.md#API参考) 48 | - [数据类型](DVP.md#数据类型) 49 | 50 | - [快速傅里叶变换加速器(FFT)](FFT.md) 51 | - [概述](FFT.md#概述) 52 | - [功能描述](FFT.md#功能描述) 53 | - [API参考](FFT.md#API参考) 54 | - [数据类型](FFT.md#数据类型) 55 | 56 | - [安全散列算法加速器(SHA256)](SHA256.md) 57 | - [功能描述](SHA256.md#功能描述) 58 | - [API参考](SHA256.md#API参考) 59 | 60 | - [通用异步收发传输器 (UART)](UART.md) 61 | - [概述](UART.md#概述) 62 | - [功能描述](UART.md#功能描述) 63 | - [API参考](UART.md#API参考) 64 | - [数据类型](UART.md#数据类型) 65 | 66 | - [高速通用异步收发传输器 (UARTHS)](UARTHS.md) 67 | - [概述](UARTHS.md#概述) 68 | - [功能描述](UARTHS.md#功能描述) 69 | - [API参考](UARTHS.md#API参考) 70 | - [数据类型](UARTHS.md#数据类型) 71 | 72 | - [看门狗定时器 (WDT)](WDT.md) 73 | - [概述](WDT.md#概述) 74 | - [功能描述](WDT.md#功能描述) 75 | - [API参考](WDT.md#API参考) 76 | - [数据类型](WDT.md#数据类型) 77 | 78 | - [直接内存存取控制器(DMAC)](DMAC.md) 79 | - [概述](DMAC.md#概述) 80 | - [功能描述](DMAC.md#功能描述) 81 | - [API参考](DMAC.md#API参考) 82 | - [数据类型](DMAC.md#数据类型) 83 | 84 | - [集成电路内置总线(I2C)](I2C.md) 85 | - [概述](I2C.md#概述) 86 | - [功能描述](I2C.md#功能描述) 87 | - [API参考](I2C.md#API参考) 88 | - [数据类型](I2C.md#数据类型) 89 | 90 | - [串行外设接口(SPI)](SPI.md) 91 | - [概述](SPI.md#概述) 92 | - [功能描述](SPI.md#功能描述) 93 | - [API参考](SPI.md#API参考) 94 | - [数据类型](SPI.md#数据类型) 95 | 96 | - [集成电路内置音频总线 (I2S)](I2S.md) 97 | - [概述](I2S.md#概述) 98 | - [功能描述](I2S.md#功能描述) 99 | - [API参考](I2S.md#API参考) 100 | - [数据类型](I2S.md#数据类型) 101 | 102 | - [定时器 (TIMER)](TIMER.md) 103 | - [概述](TIMER.md#概述) 104 | - [功能描述](TIMER.md#功能描述) 105 | - [API参考](TIMER.md#API参考) 106 | - [数据类型](TIMER.md#数据类型) 107 | 108 | - [实时时钟(RTC)](RTC.md) 109 | - [概述](RTC.md#概述) 110 | - [功能描述](RTC.md#功能描述) 111 | - [API参考](FFT.md#API参考) 112 | 113 | - [脉冲宽度调制器(PWM)](PWM.md) 114 | - [概述](PWM.md#概述) 115 | - [功能描述](PWM.md#功能描述) 116 | - [API参考](PWM.md#API参考) 117 | - [数据类型](PWM.md#数据类型) 118 | 119 | - [系统控制](SYSCTL.md) 120 | - [概述](SYSCTL.md#概述) 121 | - [功能描述](SYSCTL.md#功能描述) 122 | - [API参考](SYSCTL.md#API参考) 123 | - [数据类型](SYSCTL.md#数据类型) 124 | 125 | - [平台相关(BSP)](BSP.md) 126 | - [概述](BSP.md#概述) 127 | - [功能描述](BSP.md#功能描述) 128 | - [API参考](BSP.md#API参考) 129 | - [数据类型](BSP.md#数据类型) -------------------------------------------------------------------------------- /zh-Hans/PWM.md: -------------------------------------------------------------------------------- 1 | # 脉冲宽度调制器(PWM) 2 | 3 | ## 概述 4 | 5 | PWM 用于控制脉冲输出的占空比。其本质是一个定时器,所以注意设置PWM号与通道时不要与TIMER定时器冲突。 6 | 7 | ## 功能描述 8 | 9 | PWM 模块具有以下功能: 10 | 11 | - 配置 PWM 输出频率 12 | - 配置 PWM 每个管脚的输出占空比 13 | 14 | ## API参考 15 | 16 | 对应头文件 `pwm.h` 17 | 18 | 为用户提供以下接口 19 | 20 | - pwm\_init 21 | 22 | - pwm\_set\_frequency 23 | 24 | - pwm\_set\_enable 25 | 26 | ### pwm\_init 27 | 28 | #### 描述 29 | 30 | 初始化PWM。 31 | 32 | #### 函数原型 33 | 34 | ```c 35 | void pwm_init(pwm_device_number_t pwm_number) 36 | ``` 37 | 38 | #### 参数 39 | 40 | | 参数名称 | 描述 | 输入输出 | 41 | | :-------- | :----- | :----: | 42 | | pwm_number | pwm号 | 输入 | 43 | 44 | #### 返回值 45 | 46 | 无。 47 | 48 | ### pwm\_set\_frequency 49 | 50 | #### 描述 51 | 52 | 设置频率及占空比。 53 | 54 | #### 函数原型 55 | 56 | ```c 57 | double pwm_set_frequency(pwm_device_number_t pwm_number, pwm_channel_number_t channel, double frequency, double duty) 58 | ``` 59 | 60 | #### 参数 61 | 62 | | 参数名称 | 描述 | 输入输出 | 63 | | :---------- | :------------------------------- | :-------- | 64 | | pwm_number | PWM号 | 输入 | 65 | | channel | PWM通道号 | 输入 | 66 | | frequency | PWM输出频率 | 输入 | 67 | | duty | 占空比 | 输入 | 68 | 69 | #### 返回值 70 | 71 | 实际输出频率。 72 | 73 | ### pwm_set_enable 74 | 75 | #### 描述 76 | 77 | 使能禁用PWM。 78 | 79 | #### 函数原型 80 | 81 | ```c 82 | void pwm_set_enable(pwm_device_number_t pwm_number, uint32_t channel, int enable) 83 | ``` 84 | 85 | #### 参数 86 | 87 | | 参数名称 | 描述 | 输入输出 | 88 | | :---------- | :------------------------------ | :-------- | 89 | | pwm_number | PWM号 | 输入 | 90 | | channel | PWM通道号 | 输入 | 91 | | enable | 使能禁用PWM
0:禁用 1:使能 | 输入 | 92 | 93 | #### 返回值 94 | 95 | 无。 96 | 97 | ### 举例 98 | 99 | ```c 100 | /* pwm0 channel 1 输出 200KHZ占空比为0.5的方波 */ 101 | /* 设置IO13作为PWM的输出管脚 */ 102 | fpioa_set_function(13, FUNC_TIMER0_TOGGLE1); 103 | pwm_init(PWM_DEVICE_0); 104 | pwm_set_frequency(PWM_DEVICE_0, PWM_CHANNEL_1, 200000, 0.5); 105 | pwm_set_enable(PWM_DEVICE_0, PWM_CHANNEL_1, 1); 106 | ``` 107 | 108 | ## 数据类型 109 | 110 | - pwm\_device\_number\_t:pwm号。 111 | 112 | - pwm\_channel\_number\_t:pwm通道号。 113 | 114 | ### pwm\_device\_number\_t 115 | 116 | #### 描述 117 | 118 | pwm号。 119 | 120 | #### 定义 121 | 122 | ```c 123 | typedef enum _pwm_device_number 124 | { 125 | PWM_DEVICE_0, 126 | PWM_DEVICE_1, 127 | PWM_DEVICE_2, 128 | PWM_DEVICE_MAX, 129 | } pwm_device_number_t; 130 | ``` 131 | 132 | #### 成员 133 | 134 | | 成员名称 | 描述 | 135 | | :------------- | :--- | 136 | | PWM\_DEVICE\_0 | PWM0 | 137 | | PWM\_DEVICE\_1 | PWM1 | 138 | | PWM\_DEVICE\_2 | PWM2 | 139 | 140 | ### pwm\_channel\_number\_t 141 | 142 | #### 描述 143 | 144 | pwm通道号。 145 | 146 | #### 定义 147 | 148 | ```c 149 | typedef enum _pwm_channel_number 150 | { 151 | PWM_CHANNEL_0, 152 | PWM_CHANNEL_1, 153 | PWM_CHANNEL_2, 154 | PWM_CHANNEL_3, 155 | PWM_CHANNEL_MAX, 156 | } pwm_channel_number_t; 157 | ``` 158 | 159 | #### 成员 160 | 161 | | 成员名称 | 描述 | 162 | | :-------------- | :------- | 163 | | PWM\_CHANNEL\_0 | PWM通道0 | 164 | | PWM\_CHANNEL\_1 | PWM通道1 | 165 | | PWM\_CHANNEL\_2 | PWM通道2 | 166 | | PWM\_CHANNEL\_3 | PWM通道3 | -------------------------------------------------------------------------------- /zh-Hant/PWM.md: -------------------------------------------------------------------------------- 1 | # 脈衝寬度調製器(PWM) 2 | 3 | ## 概述 4 | 5 | PWM 用於控制脈衝輸出的占空比。其本質是一個定時器,所以註意設置PWM號與通道時不要與TIMER定時器衝突。 6 | 7 | ## 功能描述 8 | 9 | PWM 模組具有以下功能: 10 | 11 | - 配置 PWM 輸出頻率 12 | - 配置 PWM 每個腳位的輸出占空比 13 | 14 | ## API參考 15 | 16 | 對應頭文件 `pwm.h` 17 | 18 | 為用戶提供以下介面 19 | 20 | - pwm\_init 21 | 22 | - pwm\_set\_frequency 23 | 24 | - pwm\_set\_enable 25 | 26 | ### pwm\_init 27 | 28 | #### 描述 29 | 30 | 初始化PWM。 31 | 32 | #### 函數原型 33 | 34 | ```c 35 | void pwm_init(pwm_device_number_t pwm_number) 36 | ``` 37 | 38 | #### 參數 39 | 40 | | 參數名稱 | 描述 | 輸入輸出 | 41 | | :-------- | :----- | :----: | 42 | | pwm_number | pwm號 | 輸入 | 43 | 44 | #### 返回值 45 | 46 | 無。 47 | 48 | ### pwm\_set\_frequency 49 | 50 | #### 描述 51 | 52 | 設置頻率及占空比。 53 | 54 | #### 函數原型 55 | 56 | ```c 57 | double pwm_set_frequency(pwm_device_number_t pwm_number, pwm_channel_number_t channel, double frequency, double duty) 58 | ``` 59 | 60 | #### 參數 61 | 62 | | 參數名稱 | 描述 | 輸入輸出 | 63 | | :---------- | :------------------------------- | :-------- | 64 | | pwm_number | PWM號 | 輸入 | 65 | | channel | PWM通道號 | 輸入 | 66 | | frequency | PWM輸出頻率 | 輸入 | 67 | | duty | 占空比 | 輸入 | 68 | 69 | #### 返回值 70 | 71 | 實際輸出頻率。 72 | 73 | ### pwm_set_enable 74 | 75 | #### 描述 76 | 77 | 啟動禁用PWM。 78 | 79 | #### 函數原型 80 | 81 | ```c 82 | void pwm_set_enable(pwm_device_number_t pwm_number, uint32_t channel, int enable) 83 | ``` 84 | 85 | #### 參數 86 | 87 | | 參數名稱 | 描述 | 輸入輸出 | 88 | | :---------- | :------------------------------ | :-------- | 89 | | pwm_number | PWM號 | 輸入 | 90 | | channel | PWM通道號 | 輸入 | 91 | | enable | 啟動禁用PWM
0:禁用 1:啟動 | 輸入 | 92 | 93 | #### 返回值 94 | 95 | 無。 96 | 97 | ### 舉例 98 | 99 | ```c 100 | /* pwm0 channel 1 輸出 200KHZ占空比為0.5的方波 */ 101 | /* 設置IO13作為PWM的輸出腳位 */ 102 | fpioa_set_function(13, FUNC_TIMER0_TOGGLE1); 103 | pwm_init(PWM_DEVICE_0); 104 | pwm_set_frequency(PWM_DEVICE_0, PWM_CHANNEL_1, 200000, 0.5); 105 | pwm_set_enable(PWM_DEVICE_0, PWM_CHANNEL_1, 1); 106 | ``` 107 | 108 | ## 資料類型 109 | 110 | - pwm\_device\_number\_t:pwm號。 111 | 112 | - pwm\_channel\_number\_t:pwm通道號。 113 | 114 | ### pwm\_device\_number\_t 115 | 116 | #### 描述 117 | 118 | pwm號。 119 | 120 | #### 定義 121 | 122 | ```c 123 | typedef enum _pwm_device_number 124 | { 125 | PWM_DEVICE_0, 126 | PWM_DEVICE_1, 127 | PWM_DEVICE_2, 128 | PWM_DEVICE_MAX, 129 | } pwm_device_number_t; 130 | ``` 131 | 132 | #### 成員 133 | 134 | | 成員名稱 | 描述 | 135 | | :------------- | :--- | 136 | | PWM\_DEVICE\_0 | PWM0 | 137 | | PWM\_DEVICE\_1 | PWM1 | 138 | | PWM\_DEVICE\_2 | PWM2 | 139 | 140 | ### pwm\_channel\_number\_t 141 | 142 | #### 描述 143 | 144 | pwm通道號。 145 | 146 | #### 定義 147 | 148 | ```c 149 | typedef enum _pwm_channel_number 150 | { 151 | PWM_CHANNEL_0, 152 | PWM_CHANNEL_1, 153 | PWM_CHANNEL_2, 154 | PWM_CHANNEL_3, 155 | PWM_CHANNEL_MAX, 156 | } pwm_channel_number_t; 157 | ``` 158 | 159 | #### 成員 160 | 161 | | 成員名稱 | 描述 | 162 | | :-------------- | :------- | 163 | | PWM\_CHANNEL\_0 | PWM通道0 | 164 | | PWM\_CHANNEL\_1 | PWM通道1 | 165 | | PWM\_CHANNEL\_2 | PWM通道2 | 166 | | PWM\_CHANNEL\_3 | PWM通道3 | -------------------------------------------------------------------------------- /en/SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Index 2 | 3 | - [KPU](KPU.md) 4 | - [Overview](KPU.md#overview) 5 | - [Features](KPU.md#features) 6 | - [API](KPU.md#api) 7 | - [Data type](KPU.md#data-type) 8 | 9 | - [AES](AES.md) 10 | - [Features](AES.md#features) 11 | - [API](AES.md#api) 12 | - [Data type](AES.md#data-type) 13 | 14 | - [Interrupt (PLIC)](INTERRUPT.md) 15 | - [Overview](INTERRUPT.md#overview) 16 | - [Features](INTERRUPT.md#features) 17 | - [API](INTERRUPT.md#api) 18 | - [Data type](INTERRUPT.md#data-type) 19 | 20 | - [GPIO](GPIO.md) 21 | - [Overview](GPIO.md#overview) 22 | - [Features](GPIO.md#features) 23 | - [API](GPIO.md#api) 24 | - [Data type](GPIO.md#data-type) 25 | 26 | - [GPIOHS](GPIOHS.md) 27 | - [Overview](GPIOHS.md#overview) 28 | - [Features](GPIOHS.md#features) 29 | - [API](GPIOHS.md#api) 30 | - [Data type](GPIOHS.md#data-type) 31 | 32 | - [FPIOA](FPIOA.md) 33 | - [Overview](FPIOA.md#overview) 34 | - [Features](FPIOA.md#features) 35 | - [API](FPIOA.md#api) 36 | - [Data type](FPIOA.md#data-type) 37 | 38 | - [DVP](DVP.md) 39 | - [Overview](DVP.md#overview) 40 | - [Features](DVP.md#features) 41 | - [API](DVP.md#api) 42 | - [Data type](DVP.md#data-type) 43 | 44 | - [FFT](FFT.md) 45 | - [Overview](FFT.md#overview) 46 | - [Features](FFT.md#features) 47 | - [API](FFT.md#api) 48 | - [Data type](FFT.md#data-type) 49 | 50 | - [SHA256](SHA256.md) 51 | - [Features](SHA256.md#features) 52 | - [API](SHA256.md#api) 53 | 54 | - [UART](UART.md) 55 | - [Overview](UART.md#overview) 56 | - [Features](UART.md#features) 57 | - [API](UART.md#api) 58 | - [Data type](UART.md#data-type) 59 | 60 | - [UARTHS](UARTHS.md) 61 | - [Overview](UARTHS.md#overview) 62 | - [Features](UARTHS.md#features) 63 | - [API](UARTHS.md#api) 64 | - [Data type](UARTHS.md#data-type) 65 | 66 | - [WDT](WDT.md) 67 | - [Overview](WDT.md#overview) 68 | - [Features](WDT.md#features) 69 | - [API](WDT.md#api) 70 | - [Data type](WDT.md#data-type) 71 | 72 | - [DMAC](DMAC.md) 73 | - [Overview](DMAC.md#overview) 74 | - [Features](DMAC.md#features) 75 | - [API](DMAC.md#api) 76 | - [Data type](DMAC.md#data-type) 77 | 78 | - [I²C](I2C.md) 79 | - [Overview](I2C.md#overview) 80 | - [Features](I2C.md#features) 81 | - [API](I2C.md#api) 82 | - [Data type](I2C.md#data-type) 83 | 84 | - [SPI](SPI.md) 85 | - [Overview](SPI.md#overview) 86 | - [Features](SPI.md#features) 87 | - [API](SPI.md#api) 88 | - [Data type](SPI.md#data-type) 89 | 90 | - [I²S](I2S.md) 91 | - [Overview](I2S.md#overview) 92 | - [Features](I2S.md#features) 93 | - [API](I2S.md#api) 94 | - [Data type](I2S.md#data-type) 95 | 96 | - [TIMER](TIMER.md) 97 | - [Overview](TIMER.md#overview) 98 | - [Features](TIMER.md#features) 99 | - [API](TIMER.md#api) 100 | - [Data type](TIMER.md#data-type) 101 | 102 | - [RTC](RTC.md) 103 | - [Overview](RTC.md#overview) 104 | - [Features](RTC.md#features) 105 | - [API](FFT.md#api) 106 | 107 | - [PWM](PWM.md) 108 | - [Overview](PWM.md#overview) 109 | - [Features](PWM.md#features) 110 | - [API](PWM.md#api) 111 | - [Data type](PWM.md#data-type) 112 | 113 | - [System control (SYSCTL)](SYSCTL.md) 114 | - [Overview](SYSCTL.md#overview) 115 | - [Features](SYSCTL.md#features) 116 | - [API](SYSCTL.md#api) 117 | - [Data type](SYSCTL.md#data-type) 118 | 119 | - [BSP](BSP.md) 120 | - [Overview](BSP.md#overview) 121 | - [Features](BSP.md#features) 122 | - [API](BSP.md#api) 123 | - [Data type](BSP.md#data-type) -------------------------------------------------------------------------------- /zh-Hans/WDT.md: -------------------------------------------------------------------------------- 1 | # 看门狗定时器 (WDT) 2 | 3 | ## 概述 4 | 5 | WDT 提供系统出错或无响应时的恢复功能。 6 | 7 | ## 功能描述 8 | 9 | WDT 模块具有以下功能: 10 | 11 | - 配置超时时间 12 | 13 | - 手动重启计时 14 | 15 | ## API 参考 16 | 17 | 对应的头文件 `wdt.h` 18 | 19 | 为用户提供以下接口 20 | 21 | - wdt\_init 22 | 23 | - wdt\_start(0.6.0后不再支持,请使用wdt\_init) 24 | 25 | - wdt\_stop 26 | 27 | - wdt\_feed 28 | 29 | - wdt\_clear\_interrupt 30 | 31 | ### wdt\_init 32 | 33 | #### 描述 34 | 35 | 配置参数,启动看门狗。不使用中断的话,将on_irq设置为NULL。 36 | 37 | #### 函数原型 38 | 39 | ```c 40 | uint32_t wdt_init(wdt_device_number_t id, uint64_t time_out_ms, plic_irq_callback_t on_irq, void *ctx) 41 | ``` 42 | 43 | #### 参数 44 | 45 | | 参数名称 | 描述 | 输入输出 | 46 | | --------------- | --------------- | --------- | 47 | | id | 看门狗编号 | 输入 | 48 | | time\_out\_ms | 超时时间(毫秒) | 输入 | 49 | | on\_irq | 中断回调函数 | 输入 | 50 | | ctx | 回调函数参数 | 输入 | 51 | 52 | #### 返回值 53 | 54 | 看门狗超时重启的实际时间(毫秒)。与time\_out\_ms有差异,一般情况会大于这个时间。在外部晶振26M的情况下,最大超时时间为330毫秒。 55 | 56 | ### wdt\_start 57 | 58 | #### 描述 59 | 60 | 启动看门狗。 61 | 62 | #### 函数原型 63 | 64 | ```c 65 | void wdt_start(wdt_device_number_t id, uint64_t time_out_ms, plic_irq_callback_t on_irq) 66 | ``` 67 | 68 | #### 参数 69 | 70 | | 参数名称 | 描述 | 输入输出 | 71 | | --------------- | --------------- | --------- | 72 | | id | 看门狗编号 | 输入 | 73 | | time\_out\_ms | 超时时间(毫秒) | 输入 | 74 | | on\_irq | 中断回调函数 | 输入 | 75 | 76 | #### 返回值 77 | 78 | 无 79 | 80 | ### wdt\_stop 81 | 82 | #### 描述 83 | 84 | 关闭看门狗。 85 | 86 | #### 函数原型 87 | 88 | ```c 89 | void wdt_stop(wdt_device_number_t id) 90 | ``` 91 | 92 | #### 参数 93 | 94 | | 参数名称 | 描述 | 输入输出 | 95 | | --------------- | --------------- | --------- | 96 | | id | 看门狗编号 | 输入 | 97 | 98 | #### 返回值 99 | 100 | 无。 101 | 102 | ### wdt\_feed 103 | 104 | #### 描述 105 | 106 | 喂狗。 107 | 108 | #### 函数原型 109 | 110 | ```c 111 | void wdt_feed(wdt_device_number_t id) 112 | ``` 113 | 114 | #### 参数 115 | 116 | | 参数名称 | 描述 | 输入输出 | 117 | | --------------- | --------------- | --------- | 118 | | id | 看门狗编号 | 输入 | 119 | 120 | #### 返回值 121 | 122 | 无。 123 | 124 | ### wdt\_clear\_interrupt 125 | 126 | #### 描述 127 | 128 | 清除中断。如果在中断函数中清除中断,则看门狗不会重启。 129 | 130 | #### 函数原型 131 | 132 | ```c 133 | void wdt_clear_interrupt(wdt_device_number_t id) 134 | ``` 135 | 136 | #### 参数 137 | 138 | | 参数名称 | 描述 | 输入输出 | 139 | | --------------- | --------------- | --------- | 140 | | id | 看门狗编号 | 输入 | 141 | 142 | #### 返回值 143 | 144 | 无。 145 | 146 | ### 举例 147 | 148 | ```c 149 | /* 2秒后进入看门狗中断函数打印Hello_world,再过2s复位 */ 150 | int wdt0_irq(void *ctx) 151 | { 152 | printf("Hello_world\n"); 153 | return 0; 154 | } 155 | plic_init(); 156 | sysctl_enable_irq(); 157 | wdt_init(WDT_DEVICE_0, 2000, wdt0_irq, NULL); 158 | ``` 159 | 160 | ## 数据类型 161 | 162 | 相关数据类型、数据结构定义如下: 163 | 164 | - wdt\_device\_number\_t 165 | 166 | ### wdt\_device\_number\_t 167 | 168 | #### 描述 169 | 170 | 看门狗编号。 171 | 172 | #### 定义 173 | 174 | ```c 175 | typedef enum _wdt_device_number 176 | { 177 | WDT_DEVICE_0, 178 | WDT_DEVICE_1, 179 | WDT_DEVICE_MAX, 180 | } wdt_device_number_t; 181 | ``` 182 | 183 | #### 成员 184 | 185 | | 成员名称 | 描述 | 186 | | --------------- | ------------ | 187 | | WDT\_DEVICE\_0 | 看门狗 0 | 188 | | WDT\_DEVICE\_1 | 看门狗 1 | -------------------------------------------------------------------------------- /zh-Hant/WDT.md: -------------------------------------------------------------------------------- 1 | # 看門狗定時器 (WDT) 2 | 3 | ## 概述 4 | 5 | WDT 提供系統出錯或無響應時的恢復功能。 6 | 7 | ## 功能描述 8 | 9 | WDT 模組具有以下功能: 10 | 11 | - 配置超時時間 12 | 13 | - 手動重啟計時 14 | 15 | ## API 參考 16 | 17 | 對應的頭文件 `wdt.h` 18 | 19 | 為用戶提供以下介面 20 | 21 | - wdt\_init 22 | 23 | - wdt\_start(0.6.0後不再支持,請使用wdt\_init) 24 | 25 | - wdt\_stop 26 | 27 | - wdt\_feed 28 | 29 | - wdt\_clear\_interrupt 30 | 31 | ### wdt\_init 32 | 33 | #### 描述 34 | 35 | 配置參數,啟動看門狗。不使用中斷的話,將on_irq設置為NULL。 36 | 37 | #### 函數原型 38 | 39 | ```c 40 | uint32_t wdt_init(wdt_device_number_t id, uint64_t time_out_ms, plic_irq_callback_t on_irq, void *ctx) 41 | ``` 42 | 43 | #### 參數 44 | 45 | | 參數名稱 | 描述 | 輸入輸出 | 46 | | --------------- | --------------- | --------- | 47 | | id | 看門狗編號 | 輸入 | 48 | | time\_out\_ms | 超時時間(毫秒) | 輸入 | 49 | | on\_irq | 中斷回調函數 | 輸入 | 50 | | ctx | 回調函數參數 | 輸入 | 51 | 52 | #### 返回值 53 | 54 | 看門狗超時重啟的實際時間(毫秒)。與time\_out\_ms有差異,一般情況會大於這個時間。在外部晶振26M的情況下,最大超時時間為330毫秒。 55 | 56 | ### wdt\_start 57 | 58 | #### 描述 59 | 60 | 啟動看門狗。 61 | 62 | #### 函數原型 63 | 64 | ```c 65 | void wdt_start(wdt_device_number_t id, uint64_t time_out_ms, plic_irq_callback_t on_irq) 66 | ``` 67 | 68 | #### 參數 69 | 70 | | 參數名稱 | 描述 | 輸入輸出 | 71 | | --------------- | --------------- | --------- | 72 | | id | 看門狗編號 | 輸入 | 73 | | time\_out\_ms | 超時時間(毫秒) | 輸入 | 74 | | on\_irq | 中斷回調函數 | 輸入 | 75 | 76 | #### 返回值 77 | 78 | 無 79 | 80 | ### wdt\_stop 81 | 82 | #### 描述 83 | 84 | 關閉看門狗。 85 | 86 | #### 函數原型 87 | 88 | ```c 89 | void wdt_stop(wdt_device_number_t id) 90 | ``` 91 | 92 | #### 參數 93 | 94 | | 參數名稱 | 描述 | 輸入輸出 | 95 | | --------------- | --------------- | --------- | 96 | | id | 看門狗編號 | 輸入 | 97 | 98 | #### 返回值 99 | 100 | 無。 101 | 102 | ### wdt\_feed 103 | 104 | #### 描述 105 | 106 | 喂狗。 107 | 108 | #### 函數原型 109 | 110 | ```c 111 | void wdt_feed(wdt_device_number_t id) 112 | ``` 113 | 114 | #### 參數 115 | 116 | | 參數名稱 | 描述 | 輸入輸出 | 117 | | --------------- | --------------- | --------- | 118 | | id | 看門狗編號 | 輸入 | 119 | 120 | #### 返回值 121 | 122 | 無。 123 | 124 | ### wdt\_clear\_interrupt 125 | 126 | #### 描述 127 | 128 | 清除中斷。如果在中斷函數中清除中斷,則看門狗不會重啟。 129 | 130 | #### 函數原型 131 | 132 | ```c 133 | void wdt_clear_interrupt(wdt_device_number_t id) 134 | ``` 135 | 136 | #### 參數 137 | 138 | | 參數名稱 | 描述 | 輸入輸出 | 139 | | --------------- | --------------- | --------- | 140 | | id | 看門狗編號 | 輸入 | 141 | 142 | #### 返回值 143 | 144 | 無。 145 | 146 | ### 舉例 147 | 148 | ```c 149 | /* 2秒後進入看門狗中斷函數列印Hello_world,再過2s複位 */ 150 | int wdt0_irq(void *ctx) 151 | { 152 | printf("Hello_world\n"); 153 | return 0; 154 | } 155 | plic_init(); 156 | sysctl_enable_irq(); 157 | wdt_init(WDT_DEVICE_0, 2000, wdt0_irq, NULL); 158 | ``` 159 | 160 | ## 資料類型 161 | 162 | 相關資料類型、資料結構定義如下: 163 | 164 | - wdt\_device\_number\_t 165 | 166 | ### wdt\_device\_number\_t 167 | 168 | #### 描述 169 | 170 | 看門狗編號。 171 | 172 | #### 定義 173 | 174 | ```c 175 | typedef enum _wdt_device_number 176 | { 177 | WDT_DEVICE_0, 178 | WDT_DEVICE_1, 179 | WDT_DEVICE_MAX, 180 | } wdt_device_number_t; 181 | ``` 182 | 183 | #### 成員 184 | 185 | | 成員名稱 | 描述 | 186 | | --------------- | ------------ | 187 | | WDT\_DEVICE\_0 | 看門狗 0 | 188 | | WDT\_DEVICE\_1 | 看門狗 1 | -------------------------------------------------------------------------------- /en/WDT.md: -------------------------------------------------------------------------------- 1 | # WDT 2 | 3 | ## Overview 4 | 5 | A watchdog timer (WDT) is a hardware timer that automatically generates a system reset if the main program neglects to periodically service it. 6 | 7 | ## Features 8 | 9 | The WDT module has the following features: 10 | 11 | - Configure timeout 12 | - Manually set the restart time 13 | - Configure to reset or enter interrupt after timeout 14 | - Clear the interrupt after entering the interrupt to cancel the reset, otherwise wait for the second timeout after reset 15 | 16 | ## API 17 | 18 | Corresponding header file `wdt.h` 19 | 20 | Provide the following interfaces 21 | 22 | - wdt\_start 23 | 24 | - wdt\_stop 25 | 26 | - wdt\_feed 27 | 28 | - wdt\_clear\_interrupt 29 | 30 | ### wdt\_start 31 | 32 | #### Description 33 | 34 | Start the watchdog. 35 | 36 | #### Function prototype 37 | 38 | ```c 39 | void wdt_start(wdt_device_number_t id, uint64_t time_out_ms, plic_irq_callback_t on_irq) 40 | ``` 41 | 42 | #### Parameter 43 | 44 | | Parameter name | Description | Input or output | 45 | | -------------- | --------------------------- | --------------- | 46 | | id | Watchdog number | Input | 47 | | time\_out\_ms | Timeout (ms) | Input | 48 | | on\_irq | Interrupt callback function | Input | 49 | 50 | #### Return value 51 | 52 | None. 53 | 54 | ### wdt\_stop 55 | 56 | #### Description 57 | 58 | Stop the watchdog. 59 | 60 | #### Function prototype 61 | 62 | ```c 63 | void wdt_stop(wdt_device_number_t id) 64 | ``` 65 | 66 | #### Parameter 67 | 68 | | Parameter name | Description | Input or output | 69 | | -------------- | --------------- | --------------- | 70 | | id | Watchdog number | Input | 71 | 72 | #### Return value 73 | 74 | None. 75 | 76 | ### wdt\_feed 77 | 78 | #### Description 79 | 80 | Feed the watchdog (clear the counter of watchdog). 81 | 82 | #### Function prototype 83 | 84 | ```c 85 | void wdt_feed(wdt_device_number_t id) 86 | ``` 87 | 88 | #### Parameter 89 | 90 | | Parameter name | Description | Input or output | 91 | | -------------- | --------------- | --------------- | 92 | | id | Watchdog number | Input | 93 | 94 | #### Return value 95 | 96 | None. 97 | 98 | ### wdt\_clear\_interrupt 99 | 100 | #### Description 101 | 102 | Clear the interrupt. If the interrupt is cleared in the interrupt function, the watchdog will not restart. 103 | 104 | #### Function prototype 105 | 106 | ```c 107 | void wdt_clear_interrupt(wdt_device_number_t id) 108 | ``` 109 | 110 | #### Parameter 111 | 112 | | Parameter name | Description | Input or output | 113 | | -------------- | --------------- | --------------- | 114 | | id | Watchdog number | Input | 115 | 116 | #### Return value 117 | 118 | None. 119 | 120 | ### Example 121 | 122 | ```c 123 | /* 124 | * After 2 seconds, enter the watchdog interrupt function to print Hello_world, 125 | * and then reset after 2 seconds. 126 | */ 127 | int wdt0_irq(void) 128 | { 129 | printf("Hello_world\n"); 130 | return 0; 131 | } 132 | plic_init(); 133 | sysctl_enable_irq(); 134 | wdt_start(WDT_DEVICE_0, 2000, wdt0_irq); 135 | ``` 136 | 137 | ## Data type 138 | 139 | The relevant data types and data structures are defined as follows: 140 | 141 | - wdt\_device\_number\_t 142 | 143 | ### wdt\_device\_number\_t 144 | 145 | #### Description 146 | 147 | Watchdog number。 148 | 149 | #### Type definition 150 | 151 | ```c 152 | typedef enum _wdt_device_number 153 | { 154 | WDT_DEVICE_0, 155 | WDT_DEVICE_1, 156 | WDT_DEVICE_MAX, 157 | } wdt_device_number_t; 158 | ``` 159 | 160 | #### Enumeration element 161 | 162 | | Element name | Description | 163 | | -------------- | ----------- | 164 | | WDT\_DEVICE\_0 | Watchdog 0 | 165 | | WDT\_DEVICE\_1 | Watchdog 1 | 166 | -------------------------------------------------------------------------------- /en/GPIO.md: -------------------------------------------------------------------------------- 1 | # GPIO 2 | 3 | ## Overview 4 | 5 | GPIO stands for General Purpose Input Output. 6 | The chip has 8 general purpose GPIOs. 7 | 8 | ## Features 9 | 10 | The GPIO unit has the following features: 11 | 12 | - Configurable up and down drive mode 13 | 14 | ## API 15 | 16 | Corresponding header file `gpio.h` 17 | 18 | Provide the following interfaces 19 | 20 | - gpio\_init 21 | 22 | - gpio\_set\_drive\_mode 23 | 24 | - gpio\_set\_pin 25 | 26 | - gpio\_get\_pin 27 | 28 | ### gpio\_init 29 | 30 | #### Description 31 | 32 | Initialize GPIO. 33 | 34 | #### Function prototype 35 | 36 | ```c 37 | int gpio_init(void) 38 | ``` 39 | 40 | #### Return value 41 | 42 | | Return value | Description | 43 | | :----------- | :---------- | 44 | | 0 | Success | 45 | | Others | Fail | 46 | 47 | ### gpio\_set\_drive\_mode 48 | 49 | #### Description 50 | 51 | Set GPIO drive mode. 52 | 53 | #### Function prototype 54 | 55 | ```c 56 | void gpio_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode) 57 | ``` 58 | 59 | #### Parameter 60 | 61 | | Parameter name | Description | Input or output | 62 | | :------------- | :--------------- | :-------------- | 63 | | pin | GPIO pin | Input | 64 | | mode | GPIO driver mode | Input | 65 | 66 | #### Return value 67 | 68 | None. 69 | 70 | ### gpio\_set\_pin 71 | 72 | #### Description 73 | 74 | Set GPIO pin value. 75 | 76 | #### Function prototype 77 | 78 | ```c 79 | void gpio_set_pin(uint8_t pin, gpio_pin_value_t value) 80 | ``` 81 | 82 | #### Parameter 83 | 84 | | Parameter name | Description | Input or output | 85 | | :------------- | :---------- | :-------------- | 86 | | pin | GPIO pin | Input | 87 | | value | GPIO value | Input | 88 | 89 | #### Return value 90 | 91 | None. 92 | 93 | ### gpio\_get\_pin 94 | 95 | #### Description 96 | 97 | Get GPIO pin value. 98 | 99 | #### Function prototype 100 | 101 | ```c 102 | gpio_pin_value_t gpio_get_pin(uint8_t pin) 103 | ``` 104 | 105 | #### Parameter 106 | 107 | | Parameter name | Description | Input or output | 108 | | :------------- | :---------- | :-------------- | 109 | | pin | GPIO pin | Input | 110 | 111 | #### Return value 112 | 113 | The result of GPIO pin value. 114 | 115 | ### Example 116 | 117 | ```c 118 | /* Set IO13 to Output and set it high */ 119 | gpio_init(); 120 | fpioa_set_function(13, FUNC_GPIO3); 121 | gpio_set_drive_mode(3, GPIO_DM_OUTPUT); 122 | gpio_set_pin(3, GPIO_PV_High); 123 | ``` 124 | 125 | ## Data type 126 | 127 | The relevant data types and data structures are defined as follows: 128 | 129 | - gpio\_drive\_mode\_t: GPIO drive mode. 130 | 131 | - gpio\_pin\_value\_t: GPIO value. 132 | 133 | ### gpio\_drive\_mode\_t 134 | 135 | #### Description 136 | 137 | GPIO drive mode. 138 | 139 | #### Type definition 140 | 141 | ```c 142 | typedef enum _gpio_drive_mode 143 | { 144 | GPIO_DM_INPUT, 145 | GPIO_DM_INPUT_PULL_DOWN, 146 | GPIO_DM_INPUT_PULL_UP, 147 | GPIO_DM_OUTPUT, 148 | } gpio_drive_mode_t; 149 | ``` 150 | 151 | #### Enumeration element 152 | 153 | | Element name | Description | 154 | | --------------------------- | --------------- | 155 | | GPIO\_DM\_INPUT | Input | 156 | | GPIO\_DM\_INPUT\_PULL\_DOWN | Input pull down | 157 | | GPIO\_DM\_INPUT\_PULL\_UP | Input pull up | 158 | | GPIO\_DM\_OUTPUT | Output | 159 | 160 | ### gpio\_pin\_value\_t 161 | 162 | #### Description 163 | 164 | GPIO value. 165 | 166 | #### Type definition 167 | 168 | ```c 169 | typedef enum _gpio_pin_value 170 | { 171 | GPIO_PV_LOW, 172 | GPIO_PV_HIGH 173 | } gpio_pin_value_t; 174 | ``` 175 | 176 | #### Enumeration element 177 | 178 | | Element name | Description | 179 | | -------------- | ----------- | 180 | | GPIO\_PV\_LOW | Low | 181 | | GPIO\_PV\_HIGH | High | -------------------------------------------------------------------------------- /en/PWM.md: -------------------------------------------------------------------------------- 1 | # PWM 2 | 3 | ## Overview 4 | 5 | A pulse width modulator (PWM) is used to control the duty cycle of the pulse output. 6 | It is essentially a timer, so be careful not to conflict with the timer when setting the PWM number and channel. 7 | 8 | ## Features 9 | 10 | The PWM module has the following features: 11 | 12 | - Configure the PWM output frequency 13 | - Configure the output duty cycle of each pin of the PWM 14 | 15 | ## API 16 | 17 | Corresponding header file `pwm.h` 18 | 19 | Provide the following interfaces 20 | 21 | - pwm\_init 22 | 23 | - pwm\_set\_frequency 24 | 25 | - pwm\_set\_enable 26 | 27 | ### pwm\_init 28 | 29 | #### Description 30 | 31 | Initialize PWM. 32 | 33 | #### Function prototype 34 | 35 | ```c 36 | void pwm_init(pwm_device_number_t pwm_number) 37 | ``` 38 | 39 | #### Parameter 40 | 41 | | Parameter name | Description | Input or output | 42 | | :------------- | :---------- | :-------------: | 43 | | pwm_number | PWM number | Input | 44 | 45 | #### Return value 46 | 47 | None. 48 | 49 | ### pwm\_set\_frequency 50 | 51 | #### Description 52 | 53 | Set the frequency and duty cycle. 54 | 55 | #### Function prototype 56 | 57 | ```c 58 | double pwm_set_frequency(pwm_device_number_t pwm_number, pwm_channel_number_t channel, double frequency, double duty) 59 | ``` 60 | 61 | #### Parameter 62 | 63 | | Parameter name | Description | Input or output | 64 | | :------------- | :------------------- | :-------------- | 65 | | pwm_number | PWM number | Input | 66 | | channel | PWM channel number | Input | 67 | | frequency | PWM output frequency | Input | 68 | | duty | Duty cycle | Input | 69 | 70 | #### Return value 71 | 72 | Actual output frequency. 73 | 74 | ### pwm_set_enable 75 | 76 | #### Description 77 | 78 | Enable or disable the PWM. 79 | 80 | #### Function prototype 81 | 82 | ```c 83 | void pwm_set_enable(pwm_device_number_t pwm_number, uint32_t channel, int enable) 84 | ``` 85 | 86 | #### Parameter 87 | 88 | | Parameter name | Description | Input or output | 89 | | :------------- | :-------------------------------------- | :-------------- | 90 | | pwm_number | PWM number | Input | 91 | | channel | PWM channel number | Input | 92 | | enable | Whether to enable, 0: Disable 1: Enable | Input | 93 | 94 | #### Return value 95 | 96 | None. 97 | 98 | ### Example 99 | 100 | ```c 101 | /* pwm0 pin0 output 200KHz square wave with duty cycle of 0.5 */ 102 | /* Set IO13 as the output pin of PWM */ 103 | fpioa_set_function(13, FUNC_TIMER0_TOGGLE1); 104 | pwm_init(PWM_DEVICE_0); 105 | pwm_set_frequency(PWM_DEVICE_0, PWM_CHANNEL_1, 200000, 0.5); 106 | pwm_set_enable(PWM_DEVICE_0, PWM_CHANNEL_1, 1); 107 | ``` 108 | 109 | ## Data type 110 | 111 | - pwm\_device\_number\_t: PWM device number. 112 | 113 | - pwm\_channel\_number\_t: PWM channel number. 114 | 115 | ### pwm\_device\_number\_t 116 | 117 | #### Description 118 | 119 | PWM device number. 120 | 121 | #### Type definition 122 | 123 | ```c 124 | typedef enum _pwm_device_number 125 | { 126 | PWM_DEVICE_0, 127 | PWM_DEVICE_1, 128 | PWM_DEVICE_2, 129 | PWM_DEVICE_MAX, 130 | } pwm_device_number_t; 131 | ``` 132 | 133 | #### Enumeration element 134 | 135 | | Element name | Description | 136 | | :------------- | :---------- | 137 | | PWM\_DEVICE\_0 | PWM0 | 138 | | PWM\_DEVICE\_1 | PWM1 | 139 | | PWM\_DEVICE\_2 | PWM2 | 140 | 141 | ### pwm\_channel\_number\_t 142 | 143 | #### Description 144 | 145 | PWM channel number. 146 | 147 | #### Type definition 148 | 149 | ```c 150 | typedef enum _pwm_channel_number 151 | { 152 | PWM_CHANNEL_0, 153 | PWM_CHANNEL_1, 154 | PWM_CHANNEL_2, 155 | PWM_CHANNEL_3, 156 | PWM_CHANNEL_MAX, 157 | } pwm_channel_number_t; 158 | ``` 159 | 160 | #### Enumeration element 161 | 162 | | Element name | Description | 163 | | :-------------- | :------------ | 164 | | PWM\_CHANNEL\_0 | PWM channel 0 | 165 | | PWM\_CHANNEL\_1 | PWM channel 1 | 166 | | PWM\_CHANNEL\_2 | PWM channel 2 | 167 | | PWM\_CHANNEL\_3 | PWM channel 3 | 168 | -------------------------------------------------------------------------------- /en/SHA256.md: -------------------------------------------------------------------------------- 1 | # SHA256 2 | 3 | ## Overview 4 | 5 | Secure Hash Algorithm (SHA) accelerator supports hardware acceleration of the sha256 algorithm. 6 | 7 | ## Features 8 | 9 | - Supports hardware acceleration of the sha256 algorithm 10 | 11 | ## API 12 | 13 | Corresponding header file `sha256.h` 14 | 15 | Provide the following interfaces 16 | 17 | - sha256\_init 18 | - sha256\_update 19 | - sha256\_final 20 | - sha256\_hard\_calculate 21 | 22 | ### sha256\_init 23 | 24 | #### Description 25 | 26 | Initialize the SHA256 accelerator. 27 | 28 | #### Function prototype 29 | 30 | ```c 31 | void sha256_init(sha256_context_t *context, size_t input_len) 32 | ``` 33 | 34 | #### Parameter 35 | 36 | | Parameter name | Description | Input or output | 37 | | :------------- | :------------------------------- | :-------------- | 38 | | context | SHA256 context | Input | 39 | | input\_len | Length of data to be SHA256 hash | Input | 40 | 41 | #### Return value 42 | 43 | None. 44 | 45 | ### Example 46 | 47 | ```c 48 | sha256_context_t context; 49 | sha256_init(&context, 128U); 50 | ``` 51 | 52 | ### sha256\_update 53 | 54 | #### Description 55 | 56 | Pass in a data block for SHA256 Hash 57 | 58 | #### Function prototype 59 | 60 | ```c 61 | void sha256_update(sha256_context_t *context, const void *input, size_t input_len) 62 | ``` 63 | 64 | #### Parameter 65 | 66 | | Parameter name | Description | Input or output | 67 | | :------------- | :---------------------------- | :-------------- | 68 | | context | SHA256 context | Input | 69 | | input | Input data block to be hashed | Input | 70 | | buf\_len | Length of input data | Input | 71 | 72 | #### Return value 73 | 74 | None. 75 | 76 | ### sha256\_final 77 | 78 | #### Description 79 | 80 | End the SHA256 Hash calculation and get the result 81 | 82 | #### Function prototype 83 | 84 | ```c 85 | void sha256_final(sha256_context_t *context, uint8_t *output) 86 | ``` 87 | 88 | #### Parameter 89 | 90 | | Parameter name | Description | Input or output | 91 | | :------------- | :------------------------------------------------------------------------------- | :-------------- | 92 | | context | SHA256 context | Input | 93 | | output | SHA256 hash result. The size of buffer must be greater than or equal to 32 bytes | Output | 94 | 95 | #### Return value 96 | 97 | None. 98 | 99 | ### sha256\_hard\_calculate 100 | 101 | #### Description 102 | 103 | Directly get the sha256 hash of the data 104 | 105 | #### Function prototype 106 | 107 | ```c 108 | void sha256_hard_calculate(const uint8_t *input, size_t input_len, uint8_t *output) 109 | ``` 110 | 111 | #### Parameter 112 | 113 | | Parameter name | Description | Input or output | 114 | | :------------- | :------------------------------------------------------------------------------- | :-------------- | 115 | | input | Input data to be hashed | Input | 116 | | input\_len | Length of input data | Input | 117 | | output | SHA256 hash result. The size of buffer must be greater than or equal to 32 bytes | Output | 118 | 119 | #### Return value 120 | 121 | None. 122 | 123 | ### Example 124 | 125 | ```c 126 | uint8_t hash[32]; 127 | sha256_hard_calculate((uint8_t *)"abc", 3, hash); 128 | ``` 129 | 130 | - Single sha256 hash 131 | 132 | ```c 133 | sha256_context_t context; 134 | sha256_init(&context, input_len); 135 | sha256_update(&context, input, input_len); 136 | sha256_final(&context, output); 137 | ``` 138 | 139 | Or you can call the `sha256_hard_calculate` function directly 140 | 141 | ```c 142 | sha256_hard_calculate(input, input_len, output); 143 | ``` 144 | 145 | - Multiple sha256 hashes 146 | 147 | ```c 148 | sha256_context_t context; 149 | sha256_init(&context, input_piece1_len + input_piece2_len); 150 | sha256_update(&context, input_piece1, input_piece1_len); 151 | sha256_update(&context, input_piece2, input_piece2_len); 152 | sha256_final(&context, output); 153 | ``` 154 | -------------------------------------------------------------------------------- /zh-Hant/BSP.md: -------------------------------------------------------------------------------- 1 | # 平臺相關(BSP) 2 | 3 | ## 概述 4 | 5 | 平臺相關的通用函數,核之間鎖的相關操作。 6 | 7 | ## 功能描述 8 | 9 | 提供獲取當前運行程序的CPU核編號的介面以及啟動第二個核的入口。 10 | 11 | ## API 參考 12 | 13 | 對應的頭文件 `bsp.h` 14 | 15 | 為用戶提供以下介面 16 | 17 | - register\_core1 18 | 19 | - current\_coreid 20 | 21 | - read\_cycle 22 | 23 | - corelock\_lock 24 | 25 | - corelock\_trylock 26 | 27 | - corelock\_unlock 28 | 29 | ### register\_core1 30 | 31 | #### 描述 32 | 33 | 向1核註冊函數,並啟動1核。 34 | 35 | #### 函數原型 36 | 37 | ```c 38 | int register_core1(core_function func, void *ctx) 39 | ``` 40 | 41 | #### 參數 42 | 43 | | 參數名稱 | 描述 | 輸入輸出 | 44 | | ------------------------------- | ------------------------ | --------- | 45 | | func | 向1核註冊的函數 | 輸入 | 46 | | ctx | 函數的參數,沒有設置為NULL | 輸入 | 47 | 48 | #### 返回值 49 | 50 | | 返回值 | 描述 | 51 | | :---- | :------ | 52 | | 0 | 成功 | 53 | | 非0 | 失敗 | 54 | 55 | ### current\_coreid 56 | 57 | #### 描述 58 | 59 | 獲取當前CPU核編號。 60 | 61 | #### 函數原型 62 | 63 | ```c 64 | #define current_coreid() read_csr(mhartid) 65 | ``` 66 | 67 | #### 參數 68 | 69 | 無。 70 | 71 | #### 返回值 72 | 73 | 當前所在CPU核的編號。 74 | 75 | #### read\_cycle 76 | 77 | #### 描述 78 | 79 | 獲取CPU開機至今的時脈數。可以用使用這個函數精準的確定程序運行時脈。可以配合sysctl\_clock\_get\_freq(SYSCTL\_CLOCK\_CPU)計算運行的時間。 80 | 81 | #### 函數原型 82 | 83 | ```c 84 | #define read_cycle() read_csr(mcycle) 85 | ``` 86 | 87 | #### 參數 88 | 89 | 無。 90 | 91 | #### 返回值 92 | 93 | 開機至今的CPU時脈數。 94 | 95 | ### corelock\_lock 96 | 97 | #### 描述 98 | 99 | 獲取核間鎖,核之間互斥的鎖,同核內該鎖會嵌套,只有異核之間會阻塞。不建議在中斷使用該函數,中斷中可以使用corelock\_trylock。 100 | 101 | #### 函數原型 102 | 103 | ```c 104 | void corelock_lock(corelock_t *lock) 105 | ``` 106 | 107 | #### 參數 108 | 109 | 核間鎖,要使用全局變數,參見舉例。 110 | 111 | #### 返回值 112 | 113 | 無。 114 | 115 | ### corelock\_trylock 116 | 117 | #### 描述 118 | 119 | 獲取核間鎖,同核時鎖會嵌套,異核時非阻塞。成功獲取鎖會返回0,失敗返回-1。 120 | 121 | #### 函數原型 122 | 123 | ```c 124 | corelock_trylock(corelock_t *lock) 125 | ``` 126 | 127 | #### 參數 128 | 129 | 核間鎖,要使用全局變數,參見舉例。 130 | 131 | #### 返回值 132 | 133 | 無。 134 | 135 | ### corelock\_unlock 136 | 137 | #### 描述 138 | 139 | 核間鎖解鎖。 140 | 141 | #### 函數原型 142 | 143 | ```c 144 | void corelock_unlock(corelock_t *lock) 145 | ``` 146 | 147 | #### 參數 148 | 149 | 核間鎖,要使用全局變數,參見舉例。 150 | 151 | #### 返回值 152 | 153 | 無。 154 | 155 | ### 舉例 156 | 157 | ```c 158 | /* 1核在0核第二次釋放鎖的時候才會獲取到鎖,通過讀cycle計算時間 */ 159 | #include 160 | #include "bsp.h" 161 | #include 162 | #include "sysctl.h" 163 | 164 | corelock_t lock; 165 | 166 | uint64_t get_time(void) 167 | { 168 | uint64_t v_cycle = read_cycle(); 169 | return v_cycle * 1000000 / sysctl_clock_get_freq(SYSCTL_CLOCK_CPU); 170 | } 171 | 172 | int core1_function(void *ctx) 173 | { 174 | uint64_t core = current_coreid(); 175 | printf("Core %ld Hello world\n", core); 176 | while(1) 177 | { 178 | uint64_t start = get_time(); 179 | corelock_lock(&lock); 180 | printf("Core %ld Hello world\n", core); 181 | sleep(1); 182 | corelock_unlock(&lock); 183 | uint64_t stop = get_time(); 184 | printf("Core %ld lock time is %ld us\n",core, stop - start); 185 | usleep(10); 186 | } 187 | } 188 | 189 | int main(void) 190 | { 191 | uint64_t core = current_coreid(); 192 | printf("Core %ld Hello world\n", core); 193 | register_core1(core1_function, NULL); 194 | while(1) 195 | { 196 | corelock_lock(&lock); 197 | sleep(1); 198 | printf("1> Core %ld sleep 1\n", core); 199 | corelock_lock(&lock); 200 | sleep(2); 201 | printf("2> Core %ld sleep 2\n", core); 202 | printf("2> Core unlock\n"); 203 | corelock_unlock(&lock); 204 | sleep(1); 205 | printf("1> Core unlock\n"); 206 | corelock_unlock(&lock); 207 | usleep(10); 208 | } 209 | } 210 | ``` 211 | 212 | ## 資料類型 213 | 214 | 相關資料類型、資料結構定義如下: 215 | 216 | - core\_function:CPU核調用的函數。 217 | 218 | - spinlock\_t:自旋鎖。 219 | 220 | - corelock\_t:核間鎖。 221 | 222 | ### core\_function 223 | 224 | #### 描述 225 | 226 | CPU核調用的函數。 227 | 228 | #### 定義 229 | 230 | ```c 231 | typedef int (*core_function)(void *ctx); 232 | ``` 233 | 234 | ### spinlock\_t 235 | 236 | 自旋鎖。 237 | 238 | #### 定義 239 | 240 | ```c 241 | typedef struct _spinlock 242 | { 243 | int lock; 244 | } spinlock_t; 245 | ``` 246 | 247 | ### corelock\_t 248 | 249 | 核間鎖。 250 | 251 | #### 定義 252 | 253 | ```c 254 | typedef struct _corelock 255 | { 256 | spinlock_t lock; 257 | int count; 258 | int core; 259 | } corelock_t; 260 | ``` -------------------------------------------------------------------------------- /zh-Hans/FFT.md: -------------------------------------------------------------------------------- 1 | # 快速傅里叶变换加速器(FFT) 2 | 3 | ## 概述 4 | 5 | FFT模块是用硬件的方式来实现FFT的基2时分运算加速。 6 | 7 | ## 功能描述 8 | 9 | 目前该模块可以支持64点、128点、256点以及512点的FFT以及IFFT。在FFT内部有两块大小为512*32bit的SRAM,在配置完成后FFT会向DMA发送TX请求,将DMA送来的送据放到其中的一块SRAM中去,直到满足当前FFT运算所需要的数据量并开始FFT运算,蝶形运算单元从包含有有效数据的SRAM中读出数据,运算结束后将数据写到另外一块SRAM中去,下次蝶形运算再从刚写入的SRAM中读出数据,运算结束后并写入另外一块SRAM,如此反复交替进行直到完成整个FFT运算。 10 | 11 | ## API参考 12 | 13 | 对应的头文件 `fft.h` 14 | 15 | 为用户提供以下接口 16 | 17 | - [fft\_complex\_uint16\_dma](#fft\_complex\_uint16\_dma) 18 | 19 | ### fft\_complex\_uint16\_dma 20 | 21 | #### 描述 22 | 23 | FFT运算。 24 | 25 | #### 函数原型 26 | 27 | ```c 28 | void fft_complex_uint16_dma(dmac_channel_number_t dma_send_channel_num, dmac_channel_number_t dma_receive_channel_num, uint16_t shift, fft_direction_t direction, const uint64_t *input, size_t point_num, uint64_t *output); 29 | ``` 30 | 31 | #### 参数 32 | 33 | | 参数名称 | 描述 | 输入输出 | 34 | | :--------------------------------------- | :------------------------- | :-------- | 35 | | dma\_send\_channel\_num | 发送数据使用的DMA通道号 | 输入 | 36 | | dma\_receive\_channel\_num | 接收数据使用的DMA通道号 | 输入 | 37 | | shift | FFT模块16位寄存器导致数据溢出(-32768~32767),FFT变换有9层,shift决定哪一层需要移位操作(如0x1ff表示9层都做移位操作;0x03表示第第一层与第二层做移位操作),防止溢出。如果移位了,则变换后的幅值不是正常FFT变换的幅值,对应关系可以参考fft_test测试demo程序。包含了求解频率点、相位、幅值的示例| 输入 | 38 | | direction | FFT正变换或是逆变换 | 输入 | 39 | | input | 输入的数据序列,格式为RIRI..,实部与虚部的精度都为16bit| 输入| 40 | | point\_num | 待运算的数据点数,只能为512/256/128/64 | 输入 | 41 | | output | 运算后结果。格式为RIRI..,实部与虚部的精度都为16bit | 输出 | 42 | 43 | #### 返回值 44 | 45 | 无。 46 | 47 | ### 举例 48 | 49 | ```c 50 | #define FFT_N 512U 51 | #define FFT_FORWARD_SHIFT 0x0U 52 | #define FFT_BACKWARD_SHIFT 0x1ffU 53 | #define PI 3.14159265358979323846 54 | complex_hard_t data_hard[FFT_N] = {0}; 55 | for (i = 0; i < FFT_N; i++) 56 | { 57 | tempf1[0] = 0.3 * cosf(2 * PI * i / FFT_N + PI / 3) * 256; 58 | tempf1[1] = 0.1 * cosf(16 * 2 * PI * i / FFT_N - PI / 9) * 256; 59 | tempf1[2] = 0.5 * cosf((19 * 2 * PI * i / FFT_N) + PI / 6) * 256; 60 | data_hard[i].real = (int16_t)(tempf1[0] + tempf1[1] + tempf1[2] + 10); 61 | data_hard[i].imag = (int16_t)0; 62 | } 63 | for (int i = 0; i < FFT_N / 2; ++i) 64 | { 65 | input_data = (fft_data_t *)&buffer_input[i]; 66 | input_data->R1 = data_hard[2 * i].real; 67 | input_data->I1 = data_hard[2 * i].imag; 68 | input_data->R2 = data_hard[2 * i + 1].real; 69 | input_data->I2 = data_hard[2 * i + 1].imag; 70 | } 71 | fft_complex_uint16_dma(DMAC_CHANNEL0, DMAC_CHANNEL1, FFT_FORWARD_SHIFT, FFT_DIR_FORWARD, buffer_input, FFT_N, buffer_output); 72 | for (i = 0; i < FFT_N / 2; i++) 73 | { 74 | output_data = (fft_data_t*)&buffer_output[i]; 75 | data_hard[2 * i].imag = output_data->I1 ; 76 | data_hard[2 * i].real = output_data->R1 ; 77 | data_hard[2 * i + 1].imag = output_data->I2 ; 78 | data_hard[2 * i + 1].real = output_data->R2 ; 79 | } 80 | for (int i = 0; i < FFT_N / 2; ++i) 81 | { 82 | input_data = (fft_data_t *)&buffer_input[i]; 83 | input_data->R1 = data_hard[2 * i].real; 84 | input_data->I1 = data_hard[2 * i].imag; 85 | input_data->R2 = data_hard[2 * i + 1].real; 86 | input_data->I2 = data_hard[2 * i + 1].imag; 87 | } 88 | fft_complex_uint16_dma(DMAC_CHANNEL0, DMAC_CHANNEL1, FFT_BACKWARD_SHIFT, FFT_DIR_BACKWARD, buffer_input, FFT_N, buffer_output); 89 | for (i = 0; i < FFT_N / 2; i++) 90 | { 91 | output_data = (fft_data_t*)&buffer_output[i]; 92 | data_hard[2 * i].imag = output_data->I1 ; 93 | data_hard[2 * i].real = output_data->R1 ; 94 | data_hard[2 * i + 1].imag = output_data->I2 ; 95 | data_hard[2 * i + 1].real = output_data->R2 ; 96 | } 97 | ``` 98 | 99 | ## 数据类型 100 | 101 | 相关数据类型、数据结构定义如下: 102 | 103 | - fft\_data\_t:FFT运算传入的数据格式。 104 | - fft\_direction\_t:FFT变换模式。 105 | 106 | ### fft\_data\_t 107 | 108 | #### 描述 109 | 110 | FFT运算传入的数据格式。 111 | 112 | #### 定义 113 | 114 | ```c 115 | typedef struct tag_fft_data 116 | { 117 | int16_t I1; 118 | int16_t R1; 119 | int16_t I2; 120 | int16_t R2; 121 | } fft_data_t; 122 | ``` 123 | 124 | #### 成员 125 | 126 | | 成员名称 | 描述 | 127 | | :----- | :--- | 128 | | I1 | 第一个数据的虚部 | 129 | | R1 | 第一个数据的实部 | 130 | | I2 | 第二个数据的虚部 | 131 | | R2 | 第二个数据的实部 | 132 | 133 | ### fft\_direction\_t 134 | 135 | #### 描述 136 | 137 | FFT变换模式 138 | 139 | #### 定义 140 | 141 | ```c 142 | typedef enum _fft_direction 143 | { 144 | FFT_DIR_BACKWARD, 145 | FFT_DIR_FORWARD, 146 | FFT_DIR_MAX, 147 | } fft_direction_t; 148 | ``` 149 | 150 | #### 成员 151 | 152 | | 成员名称 | 描述 | 153 | | :----- | :--- | 154 | | FFT\_DIR\_BACKWARD | FFT逆变换 | 155 | | FFT\_DIR\_FORWARD | FFT正变换 | -------------------------------------------------------------------------------- /zh-Hant/FFT.md: -------------------------------------------------------------------------------- 1 | # 快速傅立葉變換加速器(FFT) 2 | 3 | ## 概述 4 | 5 | FFT模組是用硬體的方式來實現FFT的基2時分運算加速。 6 | 7 | ## 功能描述 8 | 9 | 目前該模組可以支持64點、128點、256點以及512點的FFT以及IFFT。在FFT內部有兩塊大小為512*32bit的SRAM,在配置完成後FFT會向DMA發送TX請求,將DMA送來的送據放到其中的一塊SRAM中去,直到滿足當前FFT運算所需要的資料量並開始FFT運算,蝶形運算單元從包含有有效資料的SRAM中讀出資料,運算結束後將資料寫到另外一塊SRAM中去,下次蝶形運算再從剛寫入的SRAM中讀出資料,運算結束後並寫入另外一塊SRAM,如此反覆交替進行直到完成整個FFT運算。 10 | 11 | ## API參考 12 | 13 | 對應的頭文件 `fft.h` 14 | 15 | 為用戶提供以下介面 16 | 17 | - [fft\_complex\_uint16\_dma](#fft\_complex\_uint16\_dma) 18 | 19 | ### fft\_complex\_uint16\_dma 20 | 21 | #### 描述 22 | 23 | FFT運算。 24 | 25 | #### 函數原型 26 | 27 | ```c 28 | void fft_complex_uint16_dma(dmac_channel_number_t dma_send_channel_num, dmac_channel_number_t dma_receive_channel_num, uint16_t shift, fft_direction_t direction, const uint64_t *input, size_t point_num, uint64_t *output); 29 | ``` 30 | 31 | #### 參數 32 | 33 | | 參數名稱 | 描述 | 輸入輸出 | 34 | | :--------------------------------------- | :------------------------- | :-------- | 35 | | dma\_send\_channel\_num | 發送資料使用的DMA通道號 | 輸入 | 36 | | dma\_receive\_channel\_num | 接收資料使用的DMA通道號 | 輸入 | 37 | | shift | FFT模組16位寄存器導致資料溢出(-32768~32767),FFT變換有9層,shift決定哪一層需要移位操作(如0x1ff表示9層都做移位操作;0x03表示第第一層與第二層做移位操作),防止溢出。如果移位了,則變換後的幅值不是正常FFT變換的幅值,對應關係可以參考fft_test測試demo程序。包含了求解頻率點、相位、幅值的示例| 輸入 | 38 | | direction | FFT正變換或是逆變換 | 輸入 | 39 | | input | 輸入的資料序列,格式為RIRI..,實部與虛部的精度都為16bit| 輸入| 40 | | point\_num | 待運算的資料點數,只能為512/256/128/64 | 輸入 | 41 | | output | 運算後結果。格式為RIRI..,實部與虛部的精度都為16bit | 輸出 | 42 | 43 | #### 返回值 44 | 45 | 無。 46 | 47 | ### 舉例 48 | 49 | ```c 50 | #define FFT_N 512U 51 | #define FFT_FORWARD_SHIFT 0x0U 52 | #define FFT_BACKWARD_SHIFT 0x1ffU 53 | #define PI 3.14159265358979323846 54 | complex_hard_t data_hard[FFT_N] = {0}; 55 | for (i = 0; i < FFT_N; i++) 56 | { 57 | tempf1[0] = 0.3 * cosf(2 * PI * i / FFT_N + PI / 3) * 256; 58 | tempf1[1] = 0.1 * cosf(16 * 2 * PI * i / FFT_N - PI / 9) * 256; 59 | tempf1[2] = 0.5 * cosf((19 * 2 * PI * i / FFT_N) + PI / 6) * 256; 60 | data_hard[i].real = (int16_t)(tempf1[0] + tempf1[1] + tempf1[2] + 10); 61 | data_hard[i].imag = (int16_t)0; 62 | } 63 | for (int i = 0; i < FFT_N / 2; ++i) 64 | { 65 | input_data = (fft_data_t *)&buffer_input[i]; 66 | input_data->R1 = data_hard[2 * i].real; 67 | input_data->I1 = data_hard[2 * i].imag; 68 | input_data->R2 = data_hard[2 * i + 1].real; 69 | input_data->I2 = data_hard[2 * i + 1].imag; 70 | } 71 | fft_complex_uint16_dma(DMAC_CHANNEL0, DMAC_CHANNEL1, FFT_FORWARD_SHIFT, FFT_DIR_FORWARD, buffer_input, FFT_N, buffer_output); 72 | for (i = 0; i < FFT_N / 2; i++) 73 | { 74 | output_data = (fft_data_t*)&buffer_output[i]; 75 | data_hard[2 * i].imag = output_data->I1 ; 76 | data_hard[2 * i].real = output_data->R1 ; 77 | data_hard[2 * i + 1].imag = output_data->I2 ; 78 | data_hard[2 * i + 1].real = output_data->R2 ; 79 | } 80 | for (int i = 0; i < FFT_N / 2; ++i) 81 | { 82 | input_data = (fft_data_t *)&buffer_input[i]; 83 | input_data->R1 = data_hard[2 * i].real; 84 | input_data->I1 = data_hard[2 * i].imag; 85 | input_data->R2 = data_hard[2 * i + 1].real; 86 | input_data->I2 = data_hard[2 * i + 1].imag; 87 | } 88 | fft_complex_uint16_dma(DMAC_CHANNEL0, DMAC_CHANNEL1, FFT_BACKWARD_SHIFT, FFT_DIR_BACKWARD, buffer_input, FFT_N, buffer_output); 89 | for (i = 0; i < FFT_N / 2; i++) 90 | { 91 | output_data = (fft_data_t*)&buffer_output[i]; 92 | data_hard[2 * i].imag = output_data->I1 ; 93 | data_hard[2 * i].real = output_data->R1 ; 94 | data_hard[2 * i + 1].imag = output_data->I2 ; 95 | data_hard[2 * i + 1].real = output_data->R2 ; 96 | } 97 | ``` 98 | 99 | ## 資料類型 100 | 101 | 相關資料類型、資料結構定義如下: 102 | 103 | - fft\_data\_t:FFT運算傳入的資料格式。 104 | - fft\_direction\_t:FFT變換模式。 105 | 106 | ### fft\_data\_t 107 | 108 | #### 描述 109 | 110 | FFT運算傳入的資料格式。 111 | 112 | #### 定義 113 | 114 | ```c 115 | typedef struct tag_fft_data 116 | { 117 | int16_t I1; 118 | int16_t R1; 119 | int16_t I2; 120 | int16_t R2; 121 | } fft_data_t; 122 | ``` 123 | 124 | #### 成員 125 | 126 | | 成員名稱 | 描述 | 127 | | :----- | :--- | 128 | | I1 | 第一個資料的虛部 | 129 | | R1 | 第一個資料的實部 | 130 | | I2 | 第二個資料的虛部 | 131 | | R2 | 第二個資料的實部 | 132 | 133 | ### fft\_direction\_t 134 | 135 | #### 描述 136 | 137 | FFT變換模式 138 | 139 | #### 定義 140 | 141 | ```c 142 | typedef enum _fft_direction 143 | { 144 | FFT_DIR_BACKWARD, 145 | FFT_DIR_FORWARD, 146 | FFT_DIR_MAX, 147 | } fft_direction_t; 148 | ``` 149 | 150 | #### 成員 151 | 152 | | 成員名稱 | 描述 | 153 | | :----- | :--- | 154 | | FFT\_DIR\_BACKWARD | FFT逆變換 | 155 | | FFT\_DIR\_FORWARD | FFT正變換 | -------------------------------------------------------------------------------- /en/KPU.md: -------------------------------------------------------------------------------- 1 | # KPU 2 | 3 | ## Overview 4 | 5 | Knowledge Processing Unit (KPU, aka Neural network Processing Unit). 6 | 7 | KPU is a general-purpose neural network processor that implements convolutional neural network calculations with low power consumption. 8 | It can acquire the size, coordinates and types of detected objects in real time, and detect and classify faces or objects. 9 | When using kpu, the neural network model must be generated with the model compiler. 10 | 11 | ## Features 12 | 13 | KPU has the following characteristics: 14 | 15 | - Supports the fixed training model that the common training framework trains according to specific restriction rules 16 | - There is no direct limit on the number of network layers, which supports separate configuration of each layer of convolutional neural network parameters, including the number of input and output channels, input and output line width and column height. 17 | - Support for two convolution kernels 1x1 and 3x3 18 | - Support for any form of activation function 19 | - The maximum supported neural network parameter size in real-time work is 5.5MiB to 5.9MiB 20 | - Maximum support network parameter size when working in non-real time is (Flash capacity) - (software size) 21 | 22 | ## API 23 | 24 | Corresponding header file `kpu.h` 25 | 26 | Provide the following interfaces 27 | 28 | - kpu\_task\_init 29 | 30 | - kpu\_run 31 | 32 | - kpu\_get\_output\_buf 33 | 34 | - kpu\_release\_output\_buf 35 | 36 | ### kpu\_task\_init 37 | 38 | #### Description 39 | 40 | Initialize the kpu task handle, which is implemented in the gencode_output.c generated by the model compiler. 41 | 42 | #### Function prototype 43 | 44 | ```c 45 | kpu_task_t* kpu_task_init(kpu_task_t* task) 46 | ``` 47 | 48 | #### Parameter 49 | 50 | | Parameter name | Description | Input or output | 51 | | -------------- | --------------- | --------------- | 52 | | task | KPU task handle | Input | 53 | 54 | #### Return value 55 | 56 | KPU task handle. 57 | 58 | ### kpu\_run 59 | 60 | #### Description 61 | 62 | Start the KPU and perform the AI operation. 63 | 64 | #### Function prototype 65 | 66 | ```c 67 | int kpu_run(kpu_task_t* v_task, dmac_channel_number_t dma_ch, const void *src, void* dest, plic_irq_callback_t callback) 68 | ``` 69 | 70 | #### Parameter 71 | 72 | | Parameter name | Description | Input or output | 73 | | -------------- | -------------------------------------- | --------------- | 74 | | task | KPU task handle | Input | 75 | | dma\_ch | DMA channel | Input | 76 | | src | Input image data | Input | 77 | | dest | Operation output | Output | 78 | | callback | Operation completion callback function | Input | 79 | 80 | #### Return value 81 | 82 | | Return value | Description | 83 | | :----------- | :---------------- | 84 | | 0 | Success | 85 | | Others | KPU is busy. Fail | 86 | 87 | ### kpu\_get\_output\_buf 88 | 89 | #### Description 90 | 91 | Get a buffer of KPU output results. 92 | 93 | #### Function prototype 94 | 95 | ```c 96 | uint8_t *kpu_get_output_buf(kpu_task_t* task) 97 | ``` 98 | 99 | #### Parameter 100 | 101 | | Parameter name | Description | Input or output | 102 | | -------------- | --------------- | --------------- | 103 | | task | KPU task handle | Input | 104 | 105 | #### Return value 106 | 107 | A pointer to the buffer of the KPU output. 108 | 109 | ### kpu\_release\_output\_buf 110 | 111 | #### Description 112 | 113 | Release the KPU output result buffer. 114 | 115 | #### Function prototype 116 | 117 | ```c 118 | void kpu_release_output_buf(uint8_t *output_buf) 119 | ``` 120 | 121 | #### Parameter 122 | 123 | | Parameter name | Description | Input or output | 124 | | -------------- | ------------------------ | --------------- | 125 | | output\_buf | KPU output result buffer | Input | 126 | 127 | #### Return value 128 | 129 | None. 130 | 131 | ## Data type 132 | 133 | The relevant data types and data structures are defined as follows: 134 | 135 | - kpu\_task\_t: KPU task structure. 136 | 137 | ### kpu\_task\_t 138 | 139 | #### Description 140 | 141 | KPU task structure. 142 | 143 | #### Type definition 144 | 145 | ```c 146 | typedef struct 147 | { 148 | kpu_layer_argument_t* layers; 149 | uint32_t length; 150 | int dma_ch; 151 | uint64_t* dst; 152 | uint32_t dst_length; 153 | plic_irq_callback_t cb; 154 | } kpu_task_t; 155 | ``` 156 | 157 | #### Enumeration element 158 | 159 | | Element name | Description | 160 | | ------------ | -------------------------------------- | 161 | | layers | KPU parameter pointer | 162 | | length | Number of layers | 163 | | dma_ch | DMA channel | 164 | | dst | Operation result output buffer pointer | 165 | | dst_length | Operation result output buffer length | 166 | | cb | Operation completion callback function | -------------------------------------------------------------------------------- /zh-Hans/UARTHS.md: -------------------------------------------------------------------------------- 1 | # 高速通用异步收发传输器 (UARTHS) 2 | 3 | ## 概述 4 | 5 | 嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。高速通用异步收发传输器 (UARTHS) 即可以满足这些要求,它能够灵活地与外部设备进行全双工数据交换。 6 | 目前系统使用该串口做为调试串口,printf时会调用该串口输出。 7 | 8 | ## 功能描述 9 | 10 | UARTHS 模块具有以下功能: 11 | 12 | - 配置 UARTHS 参数 13 | 14 | - 自动收取数据到缓冲区 15 | 16 | ## API 参考 17 | 18 | 对应的头文件 `uarths.h` 19 | 20 | 为用户提供以下接口 21 | 22 | - uarths\_init 23 | 24 | - uarths\_config 25 | 26 | - uarths\_receive\_data 27 | 28 | - uarths\_send\_data 29 | 30 | - uarths\_set\_irq 31 | 32 | - uarths\_get\_interrupt\_mode 33 | 34 | - uarths\_set\_interrupt\_cnt 35 | 36 | ### uarths\_init 37 | 38 | #### 描述 39 | 40 | 初始化UARTHS,系统默认波特率为115200 8bit 1位停止位 无检验位。因为uarths时钟源为PLL0,在设置PLL0后需要重新调用该函数设置波特率,否则会打印乱码。 41 | 42 | #### 函数原型 43 | 44 | ```c 45 | void uarths_init(void) 46 | ``` 47 | 48 | #### 参数 49 | 50 | 无。 51 | 52 | #### 返回值 53 | 54 | 无。 55 | 56 | ### uarths\_config 57 | 58 | #### 描述 59 | 60 | 设置UARTHS的参数。默认8bit数据,无校验位。 61 | 62 | #### 函数原型 63 | 64 | ```c 65 | void uarths_config(uint32_t baud_rate, uarths_stopbit_t stopbit) 66 | ``` 67 | 68 | ### 参数 69 | 70 | | 参数名称 | 描述 | 输入输出 | 71 | | ---------- | ------------ | --------- | 72 | | baud\_rate | 波特率 | 输入 | 73 | | stopbit | 停止位 | 输入 | 74 | 75 | #### 返回值 76 | 77 | 无。 78 | 79 | ### uarths\_receive\_data 80 | 81 | #### 描述 82 | 83 | 通过UARTHS读取数据。 84 | 85 | #### 函数原型 86 | 87 | ```c 88 | size_t uarths_receive_data(uint8_t *buf, size_t buf_len) 89 | ``` 90 | 91 | #### 参数 92 | 93 | | 参数名称 | 描述 | 输入输出 | 94 | | ---------- | --------------- | --------- | 95 | | buf | 接收数据 | 输出 | 96 | | buf\_len | 接收数据的长度 | 输入 | 97 | 98 | #### 返回值 99 | 100 | 已接收到的数据长度。 101 | 102 | ### uarths\_send\_data 103 | 104 | #### 描述 105 | 106 | 通过UART发送数据。 107 | 108 | #### 函数原型 109 | 110 | ```c 111 | size_t uarths_send_data(const uint8_t *buf, size_t buf_len) 112 | ``` 113 | 114 | #### 参数 115 | 116 | | 参数名称 | 描述 | 输入输出 | 117 | | ---------- | --------------- | --------- | 118 | | buf | 待发送数据 | 输入 | 119 | | buf\_len | 待发送数据的长度 | 输入 | 120 | 121 | #### 返回值 122 | 123 | 已发送数据的长度。 124 | 125 | ### uarths\_set\_irq 126 | 127 | #### 描述 128 | 129 | 设置UARTHS中断回调函数。 130 | 131 | #### 函数原型 132 | 133 | ```c 134 | void uarths_set_irq(uarths_interrupt_mode_t interrupt_mode, plic_irq_callback_t uarths_callback, void *ctx, uint32_t priority) 135 | ``` 136 | 137 | #### 参数 138 | 139 | | 参数名称 | 描述 | 输入输出 | 140 | | ----------------------------- | --------------- | --------- | 141 | | interrupt\_mode | 中断类型 | 输入 | 142 | | uarths\_callback | 中断回调函数 | 输入 | 143 | | ctx | 回调函数的参数 | 输入 | 144 | | priority | 中断优先级 | 输入 | 145 | 146 | #### 返回值 147 | 148 | 无。 149 | 150 | ### uarths\_get\_interrupt\_mode 151 | 152 | #### 描述 153 | 154 | 获取UARTHS的中断类型。接收、发送或接收发送同时中断。 155 | 156 | #### 函数原型 157 | 158 | ```c 159 | uarths_interrupt_mode_t uarths_get_interrupt_mode(void) 160 | ``` 161 | 162 | #### 参数 163 | 164 | 无 165 | 166 | #### 返回值 167 | 168 | 当前中断的类型。 169 | 170 | ### uarths\_set\_interrupt\_cnt 171 | 172 | #### 描述 173 | 174 | 设置UARTHS中断时的FIFO深度。 175 | 当中断类型为UARTHS\_SEND\_RECEIVE,发送接收FIFO中断深度均为cnt; 176 | 177 | #### 函数原型 178 | 179 | ```c 180 | void uarths_set_interrupt_cnt(uarths_interrupt_mode_t interrupt_mode, uint8_t cnt) 181 | ``` 182 | 183 | #### 参数 184 | 185 | | 参数名称 | 描述 | 输入输出 | 186 | | ----------------------------- | --------------- | --------- | 187 | | interrupt\_mode | 中断类型 | 输入 | 188 | | cnt | FIFO深度 | 输入 | 189 | 190 | #### 返回值 191 | 192 | 无。 193 | 194 | ### 举例 195 | 196 | ```c 197 | /* 设置接收中断 中断FIFO深度为0,即接收到数据立即中断并读取接收到的数据。*/ 198 | int uarths_irq(void *ctx) 199 | { 200 | if(!uarths_receive_data((uint8_t *)&receive_char, 1)) 201 | printf("Uarths receive ERR!\n"); 202 | return 0; 203 | } 204 | 205 | plic_init(); 206 | uarths_set_interrupt_cnt(UARTHS_RECEIVE , 0); 207 | uarths_set_irq(UARTHS_RECEIVE ,uarths_irq, NULL, 4); 208 | sysctl_enable_irq(); 209 | ``` 210 | 211 | ## 数据类型 212 | 213 | 相关数据类型、数据结构定义如下: 214 | 215 | - uarths\_interrupt\_mode\_t:中断类型。 216 | - uarths\_stopbit\_t:停止位。 217 | 218 | ### uarths\_interrupt\_mode\_t 219 | 220 | ### 描述 221 | 222 | UARTHS中断类型。 223 | 224 | #### 定义 225 | 226 | ```c 227 | typedef enum _uarths_interrupt_mode 228 | { 229 | UARTHS_SEND = 1, 230 | UARTHS_RECEIVE = 2, 231 | UARTHS_SEND_RECEIVE = 3, 232 | } uarths_interrupt_mode_t; 233 | ``` 234 | 235 | #### 成员 236 | 237 | | 成员名称 | 描述 | 238 | | -------------------- | ------------ | 239 | | UARTHS_SEND | 发送中断 | 240 | | UARTHS_RECEIVE | 接收中断 | 241 | | UARTHS\_SEND\_RECEIVE | 发送接收中断 | 242 | 243 | ### uarths\_stopbit\_t 244 | 245 | #### 描述: 246 | 247 | UARTHS停止位。 248 | 249 | #### 定义 250 | 251 | ```c 252 | typedef enum _uarths_stopbit 253 | { 254 | UART_STOP_1, 255 | UART_STOP_2 256 | } uarths_stopbit_t; 257 | ``` 258 | 259 | #### 成员 260 | 261 | | 成员名称 | 描述 | 262 | | -------------------- | ------------ | 263 | | UART\_STOP\_1 | 1位停止位 | 264 | | UART\_STOP\_2 | 2位停止位 | -------------------------------------------------------------------------------- /zh-Hant/UARTHS.md: -------------------------------------------------------------------------------- 1 | # 高速通用非同步收發傳輸器 (UARTHS) 2 | 3 | ## 概述 4 | 5 | 嵌入式應用通常要求一個簡單的並且占用系統資源少的方法來傳輸資料。高速通用非同步收發傳輸器 (UARTHS) 即可以滿足這些要求,它能夠靈活地與外部裝置進行全雙工資料交換。 6 | 目前系統使用該串口做為調試串口,printf時會調用該串口輸出。 7 | 8 | ## 功能描述 9 | 10 | UARTHS 模組具有以下功能: 11 | 12 | - 配置 UARTHS 參數 13 | 14 | - 自動收取資料到緩衝區 15 | 16 | ## API 參考 17 | 18 | 對應的頭文件 `uarths.h` 19 | 20 | 為用戶提供以下介面 21 | 22 | - uarths\_init 23 | 24 | - uarths\_config 25 | 26 | - uarths\_receive\_data 27 | 28 | - uarths\_send\_data 29 | 30 | - uarths\_set\_irq 31 | 32 | - uarths\_get\_interrupt\_mode 33 | 34 | - uarths\_set\_interrupt\_cnt 35 | 36 | ### uarths\_init 37 | 38 | #### 描述 39 | 40 | 初始化UARTHS,系統默認波特率為115200 8bit 1位停止位 無檢驗位。因為uarths時脈源為PLL0,在設置PLL0後需要重新調用該函數設置波特率,否則會列印亂碼。 41 | 42 | #### 函數原型 43 | 44 | ```c 45 | void uarths_init(void) 46 | ``` 47 | 48 | #### 參數 49 | 50 | 無。 51 | 52 | #### 返回值 53 | 54 | 無。 55 | 56 | ### uarths\_config 57 | 58 | #### 描述 59 | 60 | 設置UARTHS的參數。默認8bit資料,無校驗位。 61 | 62 | #### 函數原型 63 | 64 | ```c 65 | void uarths_config(uint32_t baud_rate, uarths_stopbit_t stopbit) 66 | ``` 67 | 68 | ### 參數 69 | 70 | | 參數名稱 | 描述 | 輸入輸出 | 71 | | ---------- | ------------ | --------- | 72 | | baud\_rate | 波特率 | 輸入 | 73 | | stopbit | 停止位 | 輸入 | 74 | 75 | #### 返回值 76 | 77 | 無。 78 | 79 | ### uarths\_receive\_data 80 | 81 | #### 描述 82 | 83 | 通過UARTHS讀取資料。 84 | 85 | #### 函數原型 86 | 87 | ```c 88 | size_t uarths_receive_data(uint8_t *buf, size_t buf_len) 89 | ``` 90 | 91 | #### 參數 92 | 93 | | 參數名稱 | 描述 | 輸入輸出 | 94 | | ---------- | --------------- | --------- | 95 | | buf | 接收資料 | 輸出 | 96 | | buf\_len | 接收資料的長度 | 輸入 | 97 | 98 | #### 返回值 99 | 100 | 已接收到的資料長度。 101 | 102 | ### uarths\_send\_data 103 | 104 | #### 描述 105 | 106 | 通過UART發送資料。 107 | 108 | #### 函數原型 109 | 110 | ```c 111 | size_t uarths_send_data(const uint8_t *buf, size_t buf_len) 112 | ``` 113 | 114 | #### 參數 115 | 116 | | 參數名稱 | 描述 | 輸入輸出 | 117 | | ---------- | --------------- | --------- | 118 | | buf | 待發送資料 | 輸入 | 119 | | buf\_len | 待發送資料的長度 | 輸入 | 120 | 121 | #### 返回值 122 | 123 | 已發送資料的長度。 124 | 125 | ### uarths\_set\_irq 126 | 127 | #### 描述 128 | 129 | 設置UARTHS中斷回調函數。 130 | 131 | #### 函數原型 132 | 133 | ```c 134 | void uarths_set_irq(uarths_interrupt_mode_t interrupt_mode, plic_irq_callback_t uarths_callback, void *ctx, uint32_t priority) 135 | ``` 136 | 137 | #### 參數 138 | 139 | | 參數名稱 | 描述 | 輸入輸出 | 140 | | ----------------------------- | --------------- | --------- | 141 | | interrupt\_mode | 中斷類型 | 輸入 | 142 | | uarths\_callback | 中斷回調函數 | 輸入 | 143 | | ctx | 回調函數的參數 | 輸入 | 144 | | priority | 中斷優先順序 | 輸入 | 145 | 146 | #### 返回值 147 | 148 | 無。 149 | 150 | ### uarths\_get\_interrupt\_mode 151 | 152 | #### 描述 153 | 154 | 獲取UARTHS的中斷類型。接收、發送或接收發送同時中斷。 155 | 156 | #### 函數原型 157 | 158 | ```c 159 | uarths_interrupt_mode_t uarths_get_interrupt_mode(void) 160 | ``` 161 | 162 | #### 參數 163 | 164 | 無 165 | 166 | #### 返回值 167 | 168 | 當前中斷的類型。 169 | 170 | ### uarths\_set\_interrupt\_cnt 171 | 172 | #### 描述 173 | 174 | 設置UARTHS中斷時的FIFO深度。 175 | 當中斷類型為UARTHS\_SEND\_RECEIVE,發送接收FIFO中斷深度均為cnt; 176 | 177 | #### 函數原型 178 | 179 | ```c 180 | void uarths_set_interrupt_cnt(uarths_interrupt_mode_t interrupt_mode, uint8_t cnt) 181 | ``` 182 | 183 | #### 參數 184 | 185 | | 參數名稱 | 描述 | 輸入輸出 | 186 | | ----------------------------- | --------------- | --------- | 187 | | interrupt\_mode | 中斷類型 | 輸入 | 188 | | cnt | FIFO深度 | 輸入 | 189 | 190 | #### 返回值 191 | 192 | 無。 193 | 194 | ### 舉例 195 | 196 | ```c 197 | /* 設置接收中斷 中斷FIFO深度為0,即接收到資料立即中斷並讀取接收到的資料。*/ 198 | int uarths_irq(void *ctx) 199 | { 200 | if(!uarths_receive_data((uint8_t *)&receive_char, 1)) 201 | printf("Uarths receive ERR!\n"); 202 | return 0; 203 | } 204 | 205 | plic_init(); 206 | uarths_set_interrupt_cnt(UARTHS_RECEIVE , 0); 207 | uarths_set_irq(UARTHS_RECEIVE ,uarths_irq, NULL, 4); 208 | sysctl_enable_irq(); 209 | ``` 210 | 211 | ## 資料類型 212 | 213 | 相關資料類型、資料結構定義如下: 214 | 215 | - uarths\_interrupt\_mode\_t:中斷類型。 216 | - uarths\_stopbit\_t:停止位。 217 | 218 | ### uarths\_interrupt\_mode\_t 219 | 220 | ### 描述 221 | 222 | UARTHS中斷類型。 223 | 224 | #### 定義 225 | 226 | ```c 227 | typedef enum _uarths_interrupt_mode 228 | { 229 | UARTHS_SEND = 1, 230 | UARTHS_RECEIVE = 2, 231 | UARTHS_SEND_RECEIVE = 3, 232 | } uarths_interrupt_mode_t; 233 | ``` 234 | 235 | #### 成員 236 | 237 | | 成員名稱 | 描述 | 238 | | -------------------- | ------------ | 239 | | UARTHS_SEND | 發送中斷 | 240 | | UARTHS_RECEIVE | 接收中斷 | 241 | | UARTHS\_SEND\_RECEIVE | 發送接收中斷 | 242 | 243 | ### uarths\_stopbit\_t 244 | 245 | #### 描述: 246 | 247 | UARTHS停止位。 248 | 249 | #### 定義 250 | 251 | ```c 252 | typedef enum _uarths_stopbit 253 | { 254 | UART_STOP_1, 255 | UART_STOP_2 256 | } uarths_stopbit_t; 257 | ``` 258 | 259 | #### 成員 260 | 261 | | 成員名稱 | 描述 | 262 | | -------------------- | ------------ | 263 | | UART\_STOP\_1 | 1位停止位 | 264 | | UART\_STOP\_2 | 2位停止位 | -------------------------------------------------------------------------------- /zh-Hans/TIMER.md: -------------------------------------------------------------------------------- 1 | # 定时器 (TIMER) 2 | 3 | ## 概述 4 | 5 | 芯片有3个定时器,每个定时器有4路通道。可以配置为PWM,详见PWM说明。 6 | 7 | ## 功能描述 8 | 9 | TIMER 模块具有以下功能: 10 | 11 | - 启用或禁用定时器 12 | - 配置定时器触发间隔 13 | - 配置定时器触发处理程序 14 | 15 | ## API 参考 16 | 17 | 对应的头文件 `timer.h` 18 | 19 | 为用户提供以下接口 20 | 21 | - timer\_init 22 | 23 | - timer\_set\_interval 24 | 25 | - timer\_set\_irq (0.6.0后不再支持,请使用timer\_irq\_register) 26 | 27 | - timer\_set\_enable 28 | 29 | - timer\_irq\_register 30 | 31 | - timer\_irq\_deregister 32 | 33 | ### timer\_init 34 | 35 | #### 描述 36 | 37 | 初始化定时器。 38 | 39 | #### 函数原型 40 | 41 | ```c 42 | void timer_init(timer_device_number_t timer_number) 43 | ``` 44 | 45 | #### 参数 46 | 47 | | 参数名称 | 描述 | 输入输出 | 48 | | :-------------- | :----------| :-------- | 49 | | timer\_number | 定时器号 | 输入 | 50 | 51 | #### 返回值 52 | 53 | 无。 54 | 55 | ### timer\_set\_interval 56 | 57 | #### 描述 58 | 59 | 设置定时间隔。 60 | 61 | #### 函数原型 62 | 63 | ```c 64 | size_t timer_set_interval(timer_device_number_t timer_number, timer_channel_number_t channel, size_t nanoseconds) 65 | ``` 66 | 67 | #### 参数 68 | 69 | | 参数名称 | 描述 | 输入输出 | 70 | | :----------- | :------------- | :-------- | 71 | | timer\_number| 定时器号 | 输入 | 72 | | channel | 定时器通道号 | 输入 | 73 | | nanoseconds | 时间间隔(纳秒) | 输入 | 74 | 75 | #### 返回值 76 | 77 | 实际的触发间隔(纳秒)。 78 | 79 | ### timer\_set\_irq 80 | 81 | #### 描述 82 | 83 | 设置定时器触发中断回调函数,该函数已废弃,替代函数为timer\_irq\_register。 84 | 85 | #### 函数原型 86 | 87 | ```c 88 | void timer_set_irq(timer_device_number_t timer_number, timer_channel_number_t channel, void(*func)(), uint32_t priority) 89 | ``` 90 | 91 | #### 参数 92 | 93 | | 参数名称 | 描述 | 输入输出 | 94 | | :------------ | :------------- | :-------- | 95 | | timer\_number | 定时器号 | 输入 | 96 | | channel | 定时器通道号 | 输入 | 97 | | func | 回调函数 | 输入 | 98 | | priority | 中断优先级 | 输入 | 99 | 100 | #### 返回值 101 | 102 | 无。 103 | 104 | ### timer\_set\_enable 105 | 106 | #### 描述 107 | 108 | 使能禁用定时器。 109 | 110 | #### 函数原型 111 | 112 | ```c 113 | void timer_set_enable(timer_device_number_t timer_number, timer_channel_number_t channel, uint32_t enable) 114 | ``` 115 | 116 | #### 参数 117 | 118 | | 参数名称 | 描述 | 输入输出 | 119 | | :------------ | :------------- | :-------- | 120 | | timer\_number | 定时器号 | 输入 | 121 | | channel | 定时器通道号 | 输入 | 122 | | enable | 使能禁用定时器
0:禁用 1:使能 | 输入 | 123 | 124 | #### 返回值 125 | 126 | 无。 127 | 128 | ### timer\_irq\_register 129 | 130 | #### 描述 131 | 132 | 注册定时器触发中断回调函数。 133 | 134 | #### 函数原型 135 | 136 | ```c 137 | int timer_irq_register(timer_device_number_t device, timer_channel_number_t channel, int is_single_shot, uint32_t priority, timer_callback_t callback, void *ctx); 138 | ``` 139 | 140 | #### 参数 141 | 142 | | 参数名称 | 描述 | 输入输出 | 143 | | :--------------- | :------------- | :-------- | 144 | | device | 定时器号 | 输入 | 145 | | channel | 定时器通道号 | 输入 | 146 | | is\_single\_shot | 是否单次中断 | 输入 | 147 | | priority | 中断优先级 | 输入 | 148 | | callback | 中断回调函数 | 输入 | 149 | | ctx | 回调函数参数 | 输入 | 150 | 151 | #### 返回值 152 | 153 | | 返回值 | 描述 | 154 | | :---- | :----| 155 | | 0 | 成功 | 156 | | 非0 | 失败 | 157 | 158 | ### timer\_irq\_deregister 159 | 160 | #### 描述 161 | 162 | 注销定时器中断函数。 163 | 164 | #### 函数原型 165 | 166 | ```c 167 | int timer_irq_deregister(timer_device_number_t device, timer_channel_number_t channel) 168 | ``` 169 | 170 | #### 参数 171 | 172 | | 参数名称 | 描述 | 输入输出 | 173 | | :--------------- | :------------- | :-------- | 174 | | device | 定时器号 | 输入 | 175 | | channel | 定时器通道号 | 输入 | 176 | 177 | #### 返回值 178 | 179 | | 返回值 | 描述 | 180 | | :---- | :----| 181 | | 0 | 成功 | 182 | | 非0 | 失败 | 183 | 184 | ### 举例 185 | 186 | ```c 187 | /* 定时器0 通道0 定时1秒打印Time OK! */ 188 | void irq_time(void) 189 | { 190 | printf("Time OK!\n"); 191 | } 192 | plic_init(); 193 | timer_init(TIMER_DEVICE_0); 194 | timer_set_interval(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1e9); 195 | timer_set_irq(TIMER_DEVICE_0, TIMER_CHANNEL_0, irq_time, 1); 196 | timer_set_enable(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1); 197 | sysctl_enable_irq(); 198 | ``` 199 | 200 | ## 数据类型 201 | 202 | 相关数据类型、数据结构定义如下: 203 | 204 | - timer\_device\_number_t:定时器编号。 205 | 206 | - timer\_channel\_number_t:定时器通道号。 207 | 208 | - timer\_callback\_t:定时器回调函数。 209 | 210 | ### timer\_device\_number_t 211 | 212 | #### 描述 213 | 214 | 定时器编号 215 | 216 | #### 定义 217 | 218 | ```c 219 | typedef enum _timer_deivce_number 220 | { 221 | TIMER_DEVICE_0, 222 | TIMER_DEVICE_1, 223 | TIMER_DEVICE_2, 224 | TIMER_DEVICE_MAX, 225 | } timer_device_number_t; 226 | ``` 227 | 228 | #### 成员 229 | 230 | | 成员名称 | 描述 | 231 | | ----------------- | ------------- | 232 | | TIMER\_DEVICE\_0 | 定时器 0 | 233 | | TIMER\_DEVICE\_1 | 定时器 1 | 234 | | TIMER\_DEVICE\_2 | 定时器 2 | 235 | 236 | ### timer\_channel\_number_t 237 | 238 | #### 描述 239 | 240 | 定时器通道号。 241 | 242 | #### 定义 243 | 244 | ```c 245 | typedef enum _timer_channel_number 246 | { 247 | TIMER_CHANNEL_0, 248 | TIMER_CHANNEL_1, 249 | TIMER_CHANNEL_2, 250 | TIMER_CHANNEL_3, 251 | TIMER_CHANNEL_MAX, 252 | } timer_channel_number_t; 253 | ``` 254 | 255 | #### 成员 256 | 257 | | 成员名称 | 描述 | 258 | | ----------------- | ---------------- | 259 | | TIMER\_CHANNEL\_0 | 定时器通道 0 | 260 | | TIMER\_CHANNEL\_1 | 定时器通道 1 | 261 | | TIMER\_CHANNEL\_2 | 定时器通道 2 | 262 | | TIMER\_CHANNEL\_3 | 定时器通道 3 | 263 | 264 | ### timer\_callback\_t 265 | 266 | #### 描述 267 | 268 | 定时器回调函数。 269 | 270 | #### 定义 271 | 272 | ```c 273 | typedef int (*timer_callback_t)(void *ctx); 274 | ``` 275 | -------------------------------------------------------------------------------- /zh-Hant/TIMER.md: -------------------------------------------------------------------------------- 1 | # 定時器 (TIMER) 2 | 3 | ## 概述 4 | 5 | 晶片有3個定時器,每個定時器有4路通道。可以配置為PWM,詳見PWM說明。 6 | 7 | ## 功能描述 8 | 9 | TIMER 模組具有以下功能: 10 | 11 | - 啟用或禁用定時器 12 | - 配置定時器觸發間隔 13 | - 配置定時器觸發處理程序 14 | 15 | ## API 參考 16 | 17 | 對應的頭文件 `timer.h` 18 | 19 | 為用戶提供以下介面 20 | 21 | - timer\_init 22 | 23 | - timer\_set\_interval 24 | 25 | - timer\_set\_irq (0.6.0後不再支持,請使用timer\_irq\_register) 26 | 27 | - timer\_set\_enable 28 | 29 | - timer\_irq\_register 30 | 31 | - timer\_irq\_deregister 32 | 33 | ### timer\_init 34 | 35 | #### 描述 36 | 37 | 初始化定時器。 38 | 39 | #### 函數原型 40 | 41 | ```c 42 | void timer_init(timer_device_number_t timer_number) 43 | ``` 44 | 45 | #### 參數 46 | 47 | | 參數名稱 | 描述 | 輸入輸出 | 48 | | :-------------- | :----------| :-------- | 49 | | timer\_number | 定時器號 | 輸入 | 50 | 51 | #### 返回值 52 | 53 | 無。 54 | 55 | ### timer\_set\_interval 56 | 57 | #### 描述 58 | 59 | 設置定時間隔。 60 | 61 | #### 函數原型 62 | 63 | ```c 64 | size_t timer_set_interval(timer_device_number_t timer_number, timer_channel_number_t channel, size_t nanoseconds) 65 | ``` 66 | 67 | #### 參數 68 | 69 | | 參數名稱 | 描述 | 輸入輸出 | 70 | | :----------- | :------------- | :-------- | 71 | | timer\_number| 定時器號 | 輸入 | 72 | | channel | 定時器通道號 | 輸入 | 73 | | nanoseconds | 時間間隔(納秒) | 輸入 | 74 | 75 | #### 返回值 76 | 77 | 實際的觸發間隔(納秒)。 78 | 79 | ### timer\_set\_irq 80 | 81 | #### 描述 82 | 83 | 設置定時器觸發中斷回調函數,該函數已廢棄,替代函數為timer\_irq\_register。 84 | 85 | #### 函數原型 86 | 87 | ```c 88 | void timer_set_irq(timer_device_number_t timer_number, timer_channel_number_t channel, void(*func)(), uint32_t priority) 89 | ``` 90 | 91 | #### 參數 92 | 93 | | 參數名稱 | 描述 | 輸入輸出 | 94 | | :------------ | :------------- | :-------- | 95 | | timer\_number | 定時器號 | 輸入 | 96 | | channel | 定時器通道號 | 輸入 | 97 | | func | 回調函數 | 輸入 | 98 | | priority | 中斷優先順序 | 輸入 | 99 | 100 | #### 返回值 101 | 102 | 無。 103 | 104 | ### timer\_set\_enable 105 | 106 | #### 描述 107 | 108 | 啟動禁用定時器。 109 | 110 | #### 函數原型 111 | 112 | ```c 113 | void timer_set_enable(timer_device_number_t timer_number, timer_channel_number_t channel, uint32_t enable) 114 | ``` 115 | 116 | #### 參數 117 | 118 | | 參數名稱 | 描述 | 輸入輸出 | 119 | | :------------ | :------------- | :-------- | 120 | | timer\_number | 定時器號 | 輸入 | 121 | | channel | 定時器通道號 | 輸入 | 122 | | enable | 啟動禁用定時器
0:禁用 1:啟動 | 輸入 | 123 | 124 | #### 返回值 125 | 126 | 無。 127 | 128 | ### timer\_irq\_register 129 | 130 | #### 描述 131 | 132 | 註冊定時器觸發中斷回調函數。 133 | 134 | #### 函數原型 135 | 136 | ```c 137 | int timer_irq_register(timer_device_number_t device, timer_channel_number_t channel, int is_single_shot, uint32_t priority, timer_callback_t callback, void *ctx); 138 | ``` 139 | 140 | #### 參數 141 | 142 | | 參數名稱 | 描述 | 輸入輸出 | 143 | | :--------------- | :------------- | :-------- | 144 | | device | 定時器號 | 輸入 | 145 | | channel | 定時器通道號 | 輸入 | 146 | | is\_single\_shot | 是否單次中斷 | 輸入 | 147 | | priority | 中斷優先順序 | 輸入 | 148 | | callback | 中斷回調函數 | 輸入 | 149 | | ctx | 回調函數參數 | 輸入 | 150 | 151 | #### 返回值 152 | 153 | | 返回值 | 描述 | 154 | | :---- | :----| 155 | | 0 | 成功 | 156 | | 非0 | 失敗 | 157 | 158 | ### timer\_irq\_deregister 159 | 160 | #### 描述 161 | 162 | 註銷定時器中斷函數。 163 | 164 | #### 函數原型 165 | 166 | ```c 167 | int timer_irq_deregister(timer_device_number_t device, timer_channel_number_t channel) 168 | ``` 169 | 170 | #### 參數 171 | 172 | | 參數名稱 | 描述 | 輸入輸出 | 173 | | :--------------- | :------------- | :-------- | 174 | | device | 定時器號 | 輸入 | 175 | | channel | 定時器通道號 | 輸入 | 176 | 177 | #### 返回值 178 | 179 | | 返回值 | 描述 | 180 | | :---- | :----| 181 | | 0 | 成功 | 182 | | 非0 | 失敗 | 183 | 184 | ### 舉例 185 | 186 | ```c 187 | /* 定時器0 通道0 定時1秒列印Time OK! */ 188 | void irq_time(void) 189 | { 190 | printf("Time OK!\n"); 191 | } 192 | plic_init(); 193 | timer_init(TIMER_DEVICE_0); 194 | timer_set_interval(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1e9); 195 | timer_set_irq(TIMER_DEVICE_0, TIMER_CHANNEL_0, irq_time, 1); 196 | timer_set_enable(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1); 197 | sysctl_enable_irq(); 198 | ``` 199 | 200 | ## 資料類型 201 | 202 | 相關資料類型、資料結構定義如下: 203 | 204 | - timer\_device\_number_t:定時器編號。 205 | 206 | - timer\_channel\_number_t:定時器通道號。 207 | 208 | - timer\_callback\_t:定時器回調函數。 209 | 210 | ### timer\_device\_number_t 211 | 212 | #### 描述 213 | 214 | 定時器編號 215 | 216 | #### 定義 217 | 218 | ```c 219 | typedef enum _timer_deivce_number 220 | { 221 | TIMER_DEVICE_0, 222 | TIMER_DEVICE_1, 223 | TIMER_DEVICE_2, 224 | TIMER_DEVICE_MAX, 225 | } timer_device_number_t; 226 | ``` 227 | 228 | #### 成員 229 | 230 | | 成員名稱 | 描述 | 231 | | ----------------- | ------------- | 232 | | TIMER\_DEVICE\_0 | 定時器 0 | 233 | | TIMER\_DEVICE\_1 | 定時器 1 | 234 | | TIMER\_DEVICE\_2 | 定時器 2 | 235 | 236 | ### timer\_channel\_number_t 237 | 238 | #### 描述 239 | 240 | 定時器通道號。 241 | 242 | #### 定義 243 | 244 | ```c 245 | typedef enum _timer_channel_number 246 | { 247 | TIMER_CHANNEL_0, 248 | TIMER_CHANNEL_1, 249 | TIMER_CHANNEL_2, 250 | TIMER_CHANNEL_3, 251 | TIMER_CHANNEL_MAX, 252 | } timer_channel_number_t; 253 | ``` 254 | 255 | #### 成員 256 | 257 | | 成員名稱 | 描述 | 258 | | ----------------- | ---------------- | 259 | | TIMER\_CHANNEL\_0 | 定時器通道 0 | 260 | | TIMER\_CHANNEL\_1 | 定時器通道 1 | 261 | | TIMER\_CHANNEL\_2 | 定時器通道 2 | 262 | | TIMER\_CHANNEL\_3 | 定時器通道 3 | 263 | 264 | ### timer\_callback\_t 265 | 266 | #### 描述 267 | 268 | 定時器回調函數。 269 | 270 | #### 定義 271 | 272 | ```c 273 | typedef int (*timer_callback_t)(void *ctx); 274 | ``` 275 | -------------------------------------------------------------------------------- /zh-Hant/I2C.md: -------------------------------------------------------------------------------- 1 | # 集成電路內置匯流排(I²C) 2 | 3 | ## 概述 4 | 5 | I2C 匯流排用於和多個外部裝置進行通信。多個外部裝置可以共用一個 I2C 匯流排。 6 | 7 | ## 功能描述 8 | 9 | I2C 模組具有以下功能: 10 | 11 | - 獨立的 I2C 裝置封裝外部裝置相關參數 12 | - 自動處理多裝置匯流排爭用 13 | 14 | ## API參考 15 | 16 | 對應的頭文件 `i2c.h` 17 | 18 | 為用戶提供以下介面 19 | 20 | - i2c\_init 21 | 22 | - i2c\_init\_as\_slave 23 | 24 | - i2c\_send\_data 25 | 26 | - i2c\_send\_data\_dma 27 | 28 | - i2c\_recv\_data 29 | 30 | - i2c\_recv\_data\_dma 31 | 32 | ### i2c\_init 33 | 34 | #### 描述 35 | 36 | 配置 I²C 器件從地址、寄存器位寬度和 I²C 速率。 37 | 38 | #### 函數原型 39 | 40 | ```c 41 | void i2c_init(i2c_device_number_t i2c_num, uint32_t slave_address, uint32_t address_width, uint32_t i2c_clk) 42 | ``` 43 | 44 | #### 參數 45 | 46 | | 參數名稱 | 描述 | 輸入輸出 | 47 | | :-------- | :----- | :----: | 48 | | i2c\_num | I²C號 | 輸入 | 49 | | slave\_address | I²C 器件從地址 | 輸入| 50 | | address\_width | I²C 器件寄存器寬度(7或10) | 輸入 51 | | i2c\_clk | I²C 速率 (Hz) | 輸入 | 52 | 53 | #### 返回值 54 | 55 | 無。 56 | 57 | ### i2c\_init\_as\_slave 58 | 59 | #### 描述 60 | 61 | 配置 I²C 為從模式。 62 | 63 | #### 函數原型 64 | 65 | ```c 66 | void i2c_init_as_slave(i2c_device_number_t i2c_num, uint32_t slave_address, uint32_t address_width, const i2c_slave_handler_t *handler) 67 | ``` 68 | 69 | #### 參數 70 | 71 | | 參數名稱 | 描述 | 輸入輸出 | 72 | | :-------- | :----- | :----: | 73 | | i2c\_num | I²C號 | 輸入 | 74 | | slave\_address | I²C 從模式的地址 | 輸入| 75 | | address\_width | I²C 器件寄存器寬度(7或10) | 輸入 76 | | handler | I²C 從模式的中斷處理函數 | 輸入 | 77 | 78 | #### 返回值 79 | 80 | 無。 81 | 82 | ### i2c\_send\_data 83 | 84 | #### 描述 85 | 86 | 寫資料。 87 | 88 | #### 函數原型 89 | 90 | ```c 91 | int i2c_send_data(i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len) 92 | ``` 93 | 94 | #### 參數 95 | 96 | | 參數名稱 | 描述 | 輸入輸出 | 97 | | :--------: | :----- | :----: | 98 | | i2c\_num | I²C號 | 輸入 | 99 | | send\_buf | 待傳輸資料 | 輸入 | 100 | | send\_buf\_len | 待傳輸資料長度 | 輸入 | 101 | 102 | #### 返回值 103 | 104 | | 返回值 | 描述 | 105 | | :---- | :----| 106 | | 0 | 成功 | 107 | | 非0 | 失敗 | 108 | 109 | ### i2c\_send\_data\_dma 110 | 111 | #### 描述 112 | 113 | 通過DMA寫資料。 114 | 115 | #### 函數原型 116 | 117 | ```c 118 | void i2c_send_data_dma(dmac_channel_number_t dma_channel_num, i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len) 119 | ``` 120 | 121 | #### 參數 122 | 123 | | 參數名稱 | 描述 | 輸入輸出 | 124 | | :-------------- | :------------- | :-------- | 125 | | dma\_channel\_num | 使用的dma通道號 | 輸入 | 126 | | i2c\_num | I²C號 | 輸入 | 127 | | send\_buf | 待傳輸資料 | 輸入 | 128 | | send\_buf\_len | 待傳輸資料長度 | 輸入 | 129 | 130 | #### 返回值 131 | 132 | 無 133 | 134 | ### i2c\_recv\_data 135 | 136 | #### 描述 137 | 138 | 通過CPU讀資料。 139 | 140 | #### 函數原型 141 | 142 | ```c 143 | int i2c_recv_data(i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len, uint8_t *receive_buf, size_t receive_buf_len) 144 | ``` 145 | 146 | #### 參數 147 | 148 | | 參數名稱 | 描述 | 輸入輸出 | 149 | | :-------------------- | :----------- | :-------- | 150 | | i2c\_num | I²C 匯流排號 | 輸入 | 151 | | send\_buf | 待傳輸資料,一般情況是i2c外部裝置的寄存器,如果沒有設置為NULL | 輸入 | 152 | | send\_buf\_len | 待傳輸資料長度,如果沒有則寫0 | 輸入 | 153 | | receive\_buf | 接收資料內部儲存 | 輸出 | 154 | | receive\_buf\_len | 接收資料的長度 | 輸入 | 155 | 156 | #### 返回值 157 | 158 | | 返回值 | 描述 | 159 | | :---- | :----| 160 | | 0 | 成功 | 161 | | 非0 | 失敗 | 162 | 163 | ### i2c\_recv\_data\_dma 164 | 165 | #### 描述 166 | 167 | 通過dma讀資料。 168 | 169 | #### 函數原型 170 | 171 | ```c 172 | void i2c_recv_data_dma(dmac_channel_number_t dma_send_channel_num, dmac_channel_number_t dma_receive_channel_num, 173 | i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len, uint8_t *receive_buf, size_t receive_buf_len) 174 | ``` 175 | 176 | #### 參數 177 | 178 | | 參數名稱 | 描述 | 輸入輸出 | 179 | | :---------------------- | :------------------ | :------- | 180 | | dma\_send\_channel\_num | 發送資料使用的dma通道 | 輸入 | 181 | | dma\_receive\_channel\_num | 接收資料使用的dma通道 | 輸入 | 182 | | i2c\_num | I²C 匯流排號 | 輸入 | 183 | | send\_buf | 待傳輸資料,一般情況是i2c外部裝置的寄存器,如果沒有設置為NULL | 輸入 | 184 | | send\_buf\_len | 待傳輸資料長度,如果沒有則寫0 | 輸入 | 185 | | receive\_buf | 接收資料內部儲存 | 輸出 | 186 | | receive\_buf\_len | 接收資料的長度 | 輸入 | 187 | 188 | #### 返回值 189 | 190 | 無 191 | 192 | ### 舉例 193 | 194 | ```c 195 | /* i2c外部裝置地址是0x32, 7位地址,速率200K */ 196 | i2c_init(I2C_DEVICE_0, 0x32, 7, 200000); 197 | uint8_t reg = 0; 198 | uint8_t data_buf[2] = {0x00,0x01} 199 | data_buf[0] = reg; 200 | /* 向0寄存器寫0x01 */ 201 | i2c_send_data(I2C_DEVICE_0, data_buf, 2); 202 | i2c_send_data_dma(DMAC_CHANNEL0, I2C_DEVICE_0, data_buf, 4); 203 | /* 從0寄存器讀取1位元組資料 */ 204 | i2c_receive_data(I2C_DEVICE_0, ®, 1, data_buf, 1); 205 | i2c_receive_data_dma(DMAC_CHANNEL0, DMAC_CHANNEL1, I2C_DEVICE_0,®, 1, data_buf, 1); 206 | ``` 207 | 208 | ## 資料類型 209 | 210 | 相關資料類型、資料結構定義如下: 211 | 212 | - i2c\_device\_number\_t:i2c號。 213 | 214 | - i2c\_slave\_handler\_t:i2c從模式的中斷處理函數句柄 215 | 216 | ### i2c\_device\_number_t 217 | 218 | #### 描述 219 | 220 | i2c編號。 221 | 222 | #### 定義 223 | 224 | ```c 225 | typedef enum _i2c_device_number 226 | { 227 | I2C_DEVICE_0, 228 | I2C_DEVICE_1, 229 | I2C_DEVICE_2, 230 | I2C_DEVICE_MAX, 231 | } i2c_device_number_t; 232 | ``` 233 | 234 | ### i2c\_slave\_handler\_t 235 | 236 | #### 描述 237 | 238 | i2c從模式的中斷處理函數句柄。根據不同的中斷狀態執行相應的函數操作。 239 | 240 | #### 定義 241 | 242 | ```c 243 | typedef struct _i2c_slave_handler 244 | { 245 | void(*on_receive)(uint32_t data); 246 | uint32_t(*on_transmit)(); 247 | void(*on_event)(i2c_event_t event); 248 | } i2c_slave_handler_t; 249 | ``` 250 | 251 | #### 成員 252 | 253 | | 成員名稱 | 描述 | 254 | | :----- | :--- | 255 | | I2C\_DEVICE\_0 | I2C 0 | 256 | | I2C\_DEVICE\_1 | I2C 1 | 257 | | I2C\_DEVICE\_2 | I2C 2 | 258 | -------------------------------------------------------------------------------- /zh-Hans/GPIOHS.md: -------------------------------------------------------------------------------- 1 | # 通用高速输入/输出 (GPIOHS) 2 | 3 | ## 概述 4 | 5 | 芯片有32个高速GPIO。与普通GPIO相似,管脚反转能力更强。 6 | 7 | ## 功能描述 8 | 9 | GPIOHS模块具有以下功能: 10 | 11 | - 可配置上下拉驱动模式 12 | - 支持上升沿、下降沿和双沿触发 13 | 14 | ## API 参考 15 | 16 | 对应的头文件 `gpiohs.h` 17 | 18 | 为用户提供以下接口 19 | 20 | - gpiohs\_set\_drive\_mode 21 | 22 | - gpiohs\_set\_pin 23 | 24 | - gpiohs\_get\_pin 25 | 26 | - gpiohs\_set\_pin\_edge 27 | 28 | - gpiohs\_set\_irq (0.6.0后不再支持,请使用gpiohs\_irq\_register) 29 | 30 | - gpiohs\_irq\_register 31 | 32 | - gpiohs\_irq\_unregister 33 | 34 | ### gpiohs\_set\_drive\_mode 35 | 36 | #### 描述 37 | 38 | 设置GPIO驱动模式。 39 | 40 | #### 函数原型 41 | 42 | ```c 43 | void gpiohs_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode) 44 | ``` 45 | 46 | #### 参数 47 | 48 | | 参数名称 | 描述 | 输入输出 | 49 | | :------------ | :------------- | :-------- | 50 | | pin | GPIO管脚 | 输入 | 51 | | mode | GPIO驱动模式 | 输入 | 52 | 53 | #### 返回值 54 | 55 | 无。 56 | 57 | ### gpio\_set\_pin 58 | 59 | #### 描述 60 | 61 | 设置GPIO管脚值。 62 | 63 | #### 函数原型 64 | 65 | ```c 66 | void gpiohs_set_pin(uint8_t pin, gpio_pin_value_t value) 67 | ``` 68 | 69 | #### 参数 70 | 71 | | 参数名称 | 描述 | 输入输出 | 72 | | :------------ | :------------- | :-------- | 73 | | pin | GPIO管脚 | 输入 | 74 | | value | GPIO值 | 输入 | 75 | 76 | #### 返回值 77 | 78 | 无。 79 | 80 | ### gpio\_get\_pin 81 | 82 | #### 描述 83 | 84 | 获取GPIO管脚值。 85 | 86 | #### 函数原型 87 | 88 | ```c 89 | gpio_pin_value_t gpiohs_get_pin(uint8_t pin) 90 | ``` 91 | 92 | #### 参数 93 | 94 | | 参数名称 | 描述 | 输入输出 | 95 | | :------------ | :------------- | :-------- | 96 | | pin | GPIO管脚 | 输入 | 97 | 98 | #### 返回值 99 | 100 | 获取的GPIO管脚值。 101 | 102 | ### gpiohs\_set\_pin\_edge 103 | 104 | #### 描述 105 | 106 | 设置高速GPIO中断触发模式。 107 | 108 | #### 函数原型 109 | 110 | ```c 111 | void gpiohs_set_pin_edge(uint8_t pin, gpio_pin_edge_t edge) 112 | ``` 113 | 114 | #### 参数 115 | 116 | | 参数名称 | 描述 | 输入输出 | 117 | | :------------ | :------------- | :-------- | 118 | | pin | GPIO管脚 | 输入 | 119 | | edge | 中断触发方式 | 输入 | 120 | 121 | #### 返回值 122 | 123 | 无。 124 | 125 | ### gpiohs\_set\_irq 126 | 127 | #### 描述 128 | 129 | 设置高速GPIO的中断回调函数。 130 | 131 | #### 函数原型 132 | 133 | ```c 134 | void gpiohs_set_irq(uint8_t pin, uint32_t priority, void(*func)()); 135 | ``` 136 | 137 | #### 参数 138 | 139 | | 参数名称 | 描述 | 输入输出 | 140 | | :------------ | :------------- | :-------- | 141 | | pin | GPIO管脚 | 输入 | 142 | | priority | 中断优先级 | 输入 | 143 | | func | 中断回调函数 | 输入 | 144 | 145 | #### 返回值 146 | 147 | 无。 148 | 149 | ### gpiohs\_irq\_register 150 | 151 | #### 描述 152 | 153 | 设置高速GPIO的中断回调函数。 154 | 155 | #### 函数原型 156 | 157 | ```c 158 | void gpiohs_irq_register(uint8_t pin, uint32_t priority, plic_irq_callback_t callback, void *ctx) 159 | ``` 160 | 161 | #### 参数 162 | 163 | | 参数名称 | 描述 | 输入输出 | 164 | | :----------------------- | :------------- | :-------- | 165 | | pin | GPIO管脚 | 输入 | 166 | | priority | 中断优先级 | 输入 | 167 | | plic\_irq\_callback\_t | 中断回调函数 | 输入 | 168 | | ctx | 回调函数参数 | 输入 | 169 | 170 | #### 返回值 171 | 172 | 无。 173 | 174 | ### gpiohs\_irq\_unregister 175 | 176 | #### 描述 177 | 178 | 注销GPIOHS中断。 179 | 180 | ### 函数原型 181 | 182 | ```c 183 | void gpiohs_irq_unregister(uint8_t pin) 184 | ``` 185 | 186 | #### 参数 187 | 188 | | 参数名称 | 描述 | 输入输出 | 189 | | :----------------------- | :------------- | :-------- | 190 | | pin | GPIO管脚 | 输入 | 191 | 192 | #### 返回值 193 | 194 | 无。 195 | 196 | ### 举例 197 | 198 | ```c 199 | void irq_gpiohs2(void *ctx) 200 | { 201 | printf("Hello world\n"); 202 | } 203 | /* 设置IO13为高速GPIO,输出模式并置为高 */ 204 | fpioa_set_function(13, FUNC_GPIOHS3); 205 | gpiohs_set_drive_mode(3, GPIO_DM_OUTPUT); 206 | gpiohs_set_pin(3, GPIO_PV_High); 207 | /* 设置IO14为高速GPIO 输入模式 双沿触发中断时打印Hello world */ 208 | plic_init(); 209 | fpioa_set_function(14, FUNC_GPIOHS2); 210 | gpiohs_set_drive_mode(2, GPIO_DM_INPUT); 211 | gpiohs_set_pin_edge(2, GPIO_PE_BOTH); 212 | gpiohs_irq_register(2, 1, irq_gpiohs2, NULL); 213 | sysctl_enable_irq(); 214 | ``` 215 | 216 | ## 数据类型 217 | 218 | 相关数据类型、数据结构定义如下: 219 | 220 | - gpio\_drive\_mode\_t:GPIO驱动模式。 221 | 222 | - gpio\_pin\_value\_t:GPIO值。 223 | 224 | - gpio\_pin\_edge\_t:GPIO边沿触发模式。 225 | 226 | ### gpio\_drive\_mode\_t 227 | 228 | #### 描述 229 | 230 | GPIO驱动模式。 231 | 232 | #### 定义 233 | 234 | ```c 235 | typedef enum _gpio_drive_mode 236 | { 237 | GPIO_DM_INPUT, 238 | GPIO_DM_INPUT_PULL_DOWN, 239 | GPIO_DM_INPUT_PULL_UP, 240 | GPIO_DM_OUTPUT, 241 | } gpio_drive_mode_t; 242 | ``` 243 | 244 | #### 成员 245 | 246 | | 成员名称 | 描述 | 247 | | --------------------------- | ----------- | 248 | | GPIO\_DM\_INPUT | 输入 | 249 | | GPIO\_DM\_INPUT\_PULL\_DOWN | 输入下拉 | 250 | | GPIO\_DM\_INPUT\_PULL\_UP | 输入上拉 | 251 | | GPIO\_DM\_OUTPUT | 输出 | 252 | 253 | ### gpio\_pin\_value\_t 254 | 255 | #### 描述 256 | 257 | GPIO 值。 258 | 259 | #### 定义 260 | 261 | ```c 262 | typedef enum _gpio_pin_value 263 | { 264 | GPIO_PV_LOW, 265 | GPIO_PV_HIGH 266 | } gpio_pin_value_t; 267 | ``` 268 | 269 | #### 成员 270 | 271 | | 成员名称 | 描述 | 272 | | ------------------ | ----------- | 273 | | GPIO\_PV\_LOW | 低 | 274 | | GPIO\_PV\_HIGH | 高 | 275 | 276 | ### gpio\_pin\_edge\_t 277 | 278 | #### 描述 279 | 280 | 高速GPIO边沿触发模式。 281 | 282 | #### 定义 283 | 284 | ```c 285 | typedef enum _gpio_pin_edge 286 | { 287 | GPIO_PE_NONE, 288 | GPIO_PE_FALLING, 289 | GPIO_PE_RISING, 290 | GPIO_PE_BOTH, 291 | GPIO_PE_LOW, 292 | GPIO_PE_HIGH = 8, 293 | } gpio_pin_edge_t; 294 | ``` 295 | 296 | #### 成员 297 | 298 | | 成员名称 | 描述 | 299 | | ------------------ | ----------- | 300 | | GPIO\_PE\_NONE | 不触发 | 301 | | GPIO\_PE\_FALLING | 下降沿触发 | 302 | | GPIO\_PE\_RISING | 上升沿触发 | 303 | | GPIO\_PE\_BOTH | 双沿触发 | 304 | | GPIO\_PE\_LOW | 低电平触发 | 305 | | GPIO\_PE\_HIGH | 高电平触发 | 306 | -------------------------------------------------------------------------------- /zh-Hant/GPIOHS.md: -------------------------------------------------------------------------------- 1 | # 通用高速輸入/輸出 (GPIOHS) 2 | 3 | ## 概述 4 | 5 | 晶片有32個高速GPIO。與普通GPIO相似,腳位反轉能力更強。 6 | 7 | ## 功能描述 8 | 9 | GPIOHS模組具有以下功能: 10 | 11 | - 可配置上下拉驅動模式 12 | - 支持正緣、負緣和雙緣觸發 13 | 14 | ## API 參考 15 | 16 | 對應的頭文件 `gpiohs.h` 17 | 18 | 為用戶提供以下介面 19 | 20 | - gpiohs\_set\_drive\_mode 21 | 22 | - gpiohs\_set\_pin 23 | 24 | - gpiohs\_get\_pin 25 | 26 | - gpiohs\_set\_pin\_edge 27 | 28 | - gpiohs\_set\_irq (0.6.0後不再支持,請使用gpiohs\_irq\_register) 29 | 30 | - gpiohs\_irq\_register 31 | 32 | - gpiohs\_irq\_unregister 33 | 34 | ### gpiohs\_set\_drive\_mode 35 | 36 | #### 描述 37 | 38 | 設置GPIO驅動模式。 39 | 40 | #### 函數原型 41 | 42 | ```c 43 | void gpiohs_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode) 44 | ``` 45 | 46 | #### 參數 47 | 48 | | 參數名稱 | 描述 | 輸入輸出 | 49 | | :------------ | :------------- | :-------- | 50 | | pin | GPIO腳位 | 輸入 | 51 | | mode | GPIO驅動模式 | 輸入 | 52 | 53 | #### 返回值 54 | 55 | 無。 56 | 57 | ### gpio\_set\_pin 58 | 59 | #### 描述 60 | 61 | 設置GPIO腳位值。 62 | 63 | #### 函數原型 64 | 65 | ```c 66 | void gpiohs_set_pin(uint8_t pin, gpio_pin_value_t value) 67 | ``` 68 | 69 | #### 參數 70 | 71 | | 參數名稱 | 描述 | 輸入輸出 | 72 | | :------------ | :------------- | :-------- | 73 | | pin | GPIO腳位 | 輸入 | 74 | | value | GPIO值 | 輸入 | 75 | 76 | #### 返回值 77 | 78 | 無。 79 | 80 | ### gpio\_get\_pin 81 | 82 | #### 描述 83 | 84 | 獲取GPIO腳位值。 85 | 86 | #### 函數原型 87 | 88 | ```c 89 | gpio_pin_value_t gpiohs_get_pin(uint8_t pin) 90 | ``` 91 | 92 | #### 參數 93 | 94 | | 參數名稱 | 描述 | 輸入輸出 | 95 | | :------------ | :------------- | :-------- | 96 | | pin | GPIO腳位 | 輸入 | 97 | 98 | #### 返回值 99 | 100 | 獲取的GPIO腳位值。 101 | 102 | ### gpiohs\_set\_pin\_edge 103 | 104 | #### 描述 105 | 106 | 設置高速GPIO中斷觸發模式。 107 | 108 | #### 函數原型 109 | 110 | ```c 111 | void gpiohs_set_pin_edge(uint8_t pin, gpio_pin_edge_t edge) 112 | ``` 113 | 114 | #### 參數 115 | 116 | | 參數名稱 | 描述 | 輸入輸出 | 117 | | :------------ | :------------- | :-------- | 118 | | pin | GPIO腳位 | 輸入 | 119 | | edge | 中斷觸發方式 | 輸入 | 120 | 121 | #### 返回值 122 | 123 | 無。 124 | 125 | ### gpiohs\_set\_irq 126 | 127 | #### 描述 128 | 129 | 設置高速GPIO的中斷回調函數。 130 | 131 | #### 函數原型 132 | 133 | ```c 134 | void gpiohs_set_irq(uint8_t pin, uint32_t priority, void(*func)()); 135 | ``` 136 | 137 | #### 參數 138 | 139 | | 參數名稱 | 描述 | 輸入輸出 | 140 | | :------------ | :------------- | :-------- | 141 | | pin | GPIO腳位 | 輸入 | 142 | | priority | 中斷優先順序 | 輸入 | 143 | | func | 中斷回調函數 | 輸入 | 144 | 145 | #### 返回值 146 | 147 | 無。 148 | 149 | ### gpiohs\_irq\_register 150 | 151 | #### 描述 152 | 153 | 設置高速GPIO的中斷回調函數。 154 | 155 | #### 函數原型 156 | 157 | ```c 158 | void gpiohs_irq_register(uint8_t pin, uint32_t priority, plic_irq_callback_t callback, void *ctx) 159 | ``` 160 | 161 | #### 參數 162 | 163 | | 參數名稱 | 描述 | 輸入輸出 | 164 | | :----------------------- | :------------- | :-------- | 165 | | pin | GPIO腳位 | 輸入 | 166 | | priority | 中斷優先順序 | 輸入 | 167 | | plic\_irq\_callback\_t | 中斷回調函數 | 輸入 | 168 | | ctx | 回調函數參數 | 輸入 | 169 | 170 | #### 返回值 171 | 172 | 無。 173 | 174 | ### gpiohs\_irq\_unregister 175 | 176 | #### 描述 177 | 178 | 註銷GPIOHS中斷。 179 | 180 | ### 函數原型 181 | 182 | ```c 183 | void gpiohs_irq_unregister(uint8_t pin) 184 | ``` 185 | 186 | #### 參數 187 | 188 | | 參數名稱 | 描述 | 輸入輸出 | 189 | | :----------------------- | :------------- | :-------- | 190 | | pin | GPIO腳位 | 輸入 | 191 | 192 | #### 返回值 193 | 194 | 無。 195 | 196 | ### 舉例 197 | 198 | ```c 199 | void irq_gpiohs2(void *ctx) 200 | { 201 | printf("Hello world\n"); 202 | } 203 | /* 設置IO13為高速GPIO,輸出模式並置為高 */ 204 | fpioa_set_function(13, FUNC_GPIOHS3); 205 | gpiohs_set_drive_mode(3, GPIO_DM_OUTPUT); 206 | gpiohs_set_pin(3, GPIO_PV_High); 207 | /* 設置IO14為高速GPIO 輸入模式 雙緣觸發中斷時列印Hello world */ 208 | plic_init(); 209 | fpioa_set_function(14, FUNC_GPIOHS2); 210 | gpiohs_set_drive_mode(2, GPIO_DM_INPUT); 211 | gpiohs_set_pin_edge(2, GPIO_PE_BOTH); 212 | gpiohs_irq_register(2, 1, irq_gpiohs2, NULL); 213 | sysctl_enable_irq(); 214 | ``` 215 | 216 | ## 資料類型 217 | 218 | 相關資料類型、資料結構定義如下: 219 | 220 | - gpio\_drive\_mode\_t:GPIO驅動模式。 221 | 222 | - gpio\_pin\_value\_t:GPIO值。 223 | 224 | - gpio\_pin\_edge\_t:GPIO邊緣觸發模式。 225 | 226 | ### gpio\_drive\_mode\_t 227 | 228 | #### 描述 229 | 230 | GPIO驅動模式。 231 | 232 | #### 定義 233 | 234 | ```c 235 | typedef enum _gpio_drive_mode 236 | { 237 | GPIO_DM_INPUT, 238 | GPIO_DM_INPUT_PULL_DOWN, 239 | GPIO_DM_INPUT_PULL_UP, 240 | GPIO_DM_OUTPUT, 241 | } gpio_drive_mode_t; 242 | ``` 243 | 244 | #### 成員 245 | 246 | | 成員名稱 | 描述 | 247 | | --------------------------- | ----------- | 248 | | GPIO\_DM\_INPUT | 輸入 | 249 | | GPIO\_DM\_INPUT\_PULL\_DOWN | 輸入下拉 | 250 | | GPIO\_DM\_INPUT\_PULL\_UP | 輸入上拉 | 251 | | GPIO\_DM\_OUTPUT | 輸出 | 252 | 253 | ### gpio\_pin\_value\_t 254 | 255 | #### 描述 256 | 257 | GPIO 值。 258 | 259 | #### 定義 260 | 261 | ```c 262 | typedef enum _gpio_pin_value 263 | { 264 | GPIO_PV_LOW, 265 | GPIO_PV_HIGH 266 | } gpio_pin_value_t; 267 | ``` 268 | 269 | #### 成員 270 | 271 | | 成員名稱 | 描述 | 272 | | ------------------ | ----------- | 273 | | GPIO\_PV\_LOW | 低 | 274 | | GPIO\_PV\_HIGH | 高 | 275 | 276 | ### gpio\_pin\_edge\_t 277 | 278 | #### 描述 279 | 280 | 高速GPIO邊緣觸發模式。 281 | 282 | #### 定義 283 | 284 | ```c 285 | typedef enum _gpio_pin_edge 286 | { 287 | GPIO_PE_NONE, 288 | GPIO_PE_FALLING, 289 | GPIO_PE_RISING, 290 | GPIO_PE_BOTH, 291 | GPIO_PE_LOW, 292 | GPIO_PE_HIGH = 8, 293 | } gpio_pin_edge_t; 294 | ``` 295 | 296 | #### 成員 297 | 298 | | 成員名稱 | 描述 | 299 | | ------------------ | ----------- | 300 | | GPIO\_PE\_NONE | 不觸發 | 301 | | GPIO\_PE\_FALLING | 負緣觸發 | 302 | | GPIO\_PE\_RISING | 正緣觸發 | 303 | | GPIO\_PE\_BOTH | 雙緣觸發 | 304 | | GPIO\_PE\_LOW | 低電平觸發 | 305 | | GPIO\_PE\_HIGH | 高電平觸發 | 306 | -------------------------------------------------------------------------------- /en/GPIOHS.md: -------------------------------------------------------------------------------- 1 | # GPIOHS 2 | 3 | ## Overview 4 | 5 | GPIO stands for General Purpose Input Output. 6 | HS stands for high speed. 7 | The chip has 32 high speed GPIOs. Similar to normal GPIO, but faster. 8 | 9 | ## Features 10 | 11 | The GPIO unit has the following features: 12 | 13 | - Configurable up and down drive mode 14 | - Support for rising edge, falling edge and double edge trigger 15 | 16 | ## API 17 | 18 | Corresponding header file `gpiohs.h` 19 | 20 | Provide the following interfaces 21 | 22 | - gpiohs\_set\_drive\_mode 23 | 24 | - gpiohs\_set\_pin 25 | 26 | - gpiohs\_get\_pin 27 | 28 | - gpiohs\_set\_pin\_edge 29 | 30 | - gpiohs\_set\_irq 31 | 32 | ### gpiohs\_set\_drive\_mode 33 | 34 | #### Description 35 | 36 | Set GPIO drive mode. 37 | 38 | #### Function prototype 39 | 40 | ```c 41 | void gpiohs_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode) 42 | ``` 43 | 44 | #### Parameter 45 | 46 | | Parameter name | Description | Input or output | 47 | | :------------- | :--------------- | :-------------- | 48 | | pin | GPIO pin | Input | 49 | | mode | GPIO driver mode | Input | 50 | 51 | #### Return value 52 | 53 | None. 54 | 55 | ### gpio\_set\_pin 56 | 57 | #### Description 58 | 59 | Set GPIO pin value. 60 | 61 | #### Function prototype 62 | 63 | ```c 64 | void gpiohs_set_pin(uint8_t pin, gpio_pin_value_t value) 65 | ``` 66 | 67 | #### Parameter 68 | 69 | | Parameter name | Description | Input or output | 70 | | :------------- | :---------- | :-------------- | 71 | | pin | GPIO pin | Input | 72 | | value | GPIO value | Input | 73 | 74 | #### Return value 75 | 76 | None. 77 | 78 | ### gpio\_get\_pin 79 | 80 | #### Description 81 | 82 | Get GPIO pin value. 83 | 84 | #### Function prototype 85 | 86 | ```c 87 | gpio_pin_value_t gpiohs_get_pin(uint8_t pin) 88 | ``` 89 | 90 | #### Parameter 91 | 92 | | Parameter name | Description | Input or output | 93 | | :------------- | :---------- | :-------------- | 94 | | pin | GPIO pin | Input | 95 | 96 | #### Return value 97 | 98 | The result of GPIO pin value. 99 | 100 | ### gpiohs\_set\_pin\_edge 101 | 102 | #### Description 103 | 104 | Set the high speed GPIO interrupt trigger mode. 105 | 106 | #### Function prototype 107 | 108 | ```c 109 | void gpiohs_set_pin_edge(uint8_t pin, gpio_pin_edge_t edge) 110 | ``` 111 | 112 | #### Parameter 113 | 114 | | Parameter name | Description | Input or output | 115 | | :------------- | :--------------------- | :-------------- | 116 | | pin | GPIO pin | Input | 117 | | edge | Interrupt trigger mode | Input | 118 | 119 | #### Return value 120 | 121 | None. 122 | 123 | ### gpiohs\_set\_irq 124 | 125 | #### Description 126 | 127 | Set the interrupt callback function for high speed GPIO. 128 | 129 | #### Function prototype 130 | 131 | ```c 132 | void gpiohs_set_irq(uint8_t pin, uint32_t priority, void(*func)()); 133 | ``` 134 | 135 | #### Parameter 136 | 137 | | Parameter name | Description | Input or output | 138 | | :------------- | :-------------------------- | :-------------- | 139 | | pin | GPIO pin | Input | 140 | | priority | Interrupt priority | Input | 141 | | func | Interrupt callback function | Input | 142 | 143 | #### Return value 144 | 145 | None. 146 | 147 | ### Example 148 | 149 | ```c 150 | void irq_gpiohs2(void) 151 | { 152 | printf("Hello world\n"); 153 | } 154 | /* Set IO13 to high speed GPIO and set the output mode to high. */ 155 | fpioa_set_function(13, FUNC_GPIOHS3); 156 | gpiohs_set_drive_mode(3, GPIO_DM_OUTPUT); 157 | gpiohs_set_pin(3, GPIO_PV_High); 158 | /* Set IO14 to high speed GPIO Input mode. Print Hello world when double edge triggers interrupt. */ 159 | plic_init(); 160 | fpioa_set_function(14, FUNC_GPIOHS2); 161 | gpiohs_set_drive_mode(2, GPIO_DM_INPUT); 162 | gpiohs_set_pin_edge(2, GPIO_PE_BOTH); 163 | gpiohs_set_irq(2, 1, irq_gpiohs2); 164 | sysctl_enable_irq(); 165 | ``` 166 | 167 | ## Data type 168 | 169 | The relevant data types and data structures are defined as follows: 170 | 171 | - gpio\_drive\_mode\_t: GPIO drive mode. 172 | 173 | - gpio\_pin\_value\_t: GPIO value. 174 | 175 | - gpio\_pin\_edge\_t: GPIO edge trigger mode. 176 | 177 | ### gpio\_drive\_mode\_t 178 | 179 | #### Description 180 | 181 | GPIO drive mode. 182 | 183 | #### Type definition 184 | 185 | ```c 186 | typedef enum _gpio_drive_mode 187 | { 188 | GPIO_DM_INPUT, 189 | GPIO_DM_INPUT_PULL_DOWN, 190 | GPIO_DM_INPUT_PULL_UP, 191 | GPIO_DM_OUTPUT, 192 | } gpio_drive_mode_t; 193 | ``` 194 | 195 | #### Enumeration element 196 | 197 | | Element name | Description | 198 | | --------------------------- | --------------- | 199 | | GPIO\_DM\_INPUT | Input | 200 | | GPIO\_DM\_INPUT\_PULL\_DOWN | Input pull down | 201 | | GPIO\_DM\_INPUT\_PULL\_UP | Input pull up | 202 | | GPIO\_DM\_OUTPUT | Output | 203 | 204 | ### gpio\_pin\_value\_t 205 | 206 | #### Description 207 | 208 | GPIO value. 209 | 210 | #### Type definition 211 | 212 | ```c 213 | typedef enum _gpio_pin_value 214 | { 215 | GPIO_PV_LOW, 216 | GPIO_PV_HIGH 217 | } gpio_pin_value_t; 218 | ``` 219 | 220 | #### Enumeration element 221 | 222 | | Element name | Description | 223 | | -------------- | ----------- | 224 | | GPIO\_PV\_LOW | Low | 225 | | GPIO\_PV\_HIGH | High | 226 | 227 | ### gpio\_pin\_edge\_t 228 | 229 | #### Description 230 | 231 | GPIO edge trigger mode. 232 | 233 | #### Type definition 234 | 235 | ```c 236 | typedef enum _gpio_pin_edge 237 | { 238 | GPIO_PE_NONE, 239 | GPIO_PE_FALLING, 240 | GPIO_PE_RISING, 241 | GPIO_PE_BOTH 242 | } gpio_pin_edge_t; 243 | ``` 244 | 245 | #### Enumeration element 246 | 247 | | Element name | Description | 248 | | ----------------- | -------------------- | 249 | | GPIO\_PE\_NONE | Do not trigger | 250 | | GPIO\_PE\_FALLING | Falling edge trigger | 251 | | GPIO\_PE\_RISING | Rising edge trigger | 252 | | GPIO\_PE\_BOTH | Double edge trigger | 253 | -------------------------------------------------------------------------------- /zh-Hans/RTC.md: -------------------------------------------------------------------------------- 1 | # 实时时钟(RTC) 2 | 3 | ## 概述 4 | 5 | RTC是用来计时的单元,在设置时间后具备计时功能。 6 | **注意** RTC模块仅当 PLL0 使能,并且 CPU 频率大于 30MHz 时使用 7 | 8 | ## 功能描述 9 | 10 | RTC 模块具有以下功能: 11 | 12 | - 获取当前日期时刻 13 | - 设置当前日期时刻 14 | 15 | ## API参考 16 | 17 | 对应的头文件 `rtc.h` 18 | 19 | 为用户提供以下接口 20 | 21 | - rtc\_init 22 | 23 | - rtc\_timer\_set 24 | 25 | - rtc\_timer\_get 26 | 27 | - rtc\_alarm\_set 28 | 29 | - rtc\_alarm\_get 30 | 31 | - rtc\_tick\_irq\_register 32 | 33 | - rtc\_tick\_irq\_unregister 34 | 35 | - rtc\_alarm\_irq\_register 36 | 37 | - rtc\_alarm\_irq\_unregister 38 | 39 | ### rtc\_init 40 | 41 | #### 描述 42 | 43 | 初始化RTC。 44 | 45 | #### 函数原型 46 | 47 | ```c 48 | int rtc_init(void) 49 | ``` 50 | 51 | #### 参数 52 | 53 | 无。 54 | 55 | #### 返回值 56 | 57 | | 返回值 | 描述 | 58 | | :---- | :----| 59 | | 0 | 成功 | 60 | | 非0 | 失败 | 61 | 62 | ### rtc\_timer\_set 63 | 64 | #### 描述 65 | 66 | 设置日期时间。 67 | 68 | #### 函数原型 69 | 70 | ```c 71 | int rtc_timer_set(int year, int month, int day, int hour, int minute, int second) 72 | ``` 73 | 74 | #### 参数 75 | 76 | | 参数名称 | 描述 | 输入输出 | 77 | | :-------- | :--------- | :-------- | 78 | | year | 年 | 输入 | 79 | | month | 月 | 输入 | 80 | | day | 日 | 输入 | 81 | | hour | 时 | 输入 | 82 | | minute | 分 | 输入 | 83 | | second | 秒 | 输入 | 84 | 85 | #### 返回值 86 | 87 | 无 88 | 89 | ### rtc\_timer\_get 90 | 91 | #### 描述 92 | 93 | 获取日期时间。 94 | 95 | #### 函数原型 96 | 97 | ```c 98 | int rtc_timer_get(int *year, int *month, int *day, int *hour, int *minute, int *second) 99 | ``` 100 | 101 | #### 参数 102 | 103 | | 参数名称 | 描述 | 输入输出 | 104 | | :-------- | :--------- | :-------- | 105 | | year | 年 | 输出 | 106 | | month | 月 | 输出 | 107 | | day | 日 | 输出 | 108 | | hour | 时 | 输出 | 109 | | minute | 分 | 输出 | 110 | | second | 秒 | 输出 | 111 | 112 | #### 返回值 113 | 114 | | 返回值 | 描述 | 115 | | :---- | :----| 116 | | 0 | 成功 | 117 | | 非0 | 失败 | 118 | 119 | ### rtc\_alarm\_set 120 | 121 | #### 描述 122 | 123 | 设置日期时间。 124 | 125 | #### 函数原型 126 | 127 | ```c 128 | int rtc_alarmr_set(int year, int month, int day, int hour, int minute, int second) 129 | ``` 130 | 131 | #### 参数 132 | 133 | | 参数名称 | 描述 | 输入输出 | 134 | | :-------- | :--------- | :-------- | 135 | | year | 年 | 输入 | 136 | | month | 月 | 输入 | 137 | | day | 日 | 输入 | 138 | | hour | 时 | 输入 | 139 | | minute | 分 | 输入 | 140 | | second | 秒 | 输入 | 141 | 142 | #### 返回值 143 | 144 | 无 145 | 146 | ### rtc\_alarm\_get 147 | 148 | #### 描述 149 | 150 | 获取日期时间。 151 | 152 | #### 函数原型 153 | 154 | ```c 155 | int rtc_alarm_get(int *year, int *month, int *day, int *hour, int *minute, int *second) 156 | ``` 157 | 158 | #### 参数 159 | 160 | | 参数名称 | 描述 | 输入输出 | 161 | | :-------- | :--------- | :-------- | 162 | | year | 年 | 输出 | 163 | | month | 月 | 输出 | 164 | | day | 日 | 输出 | 165 | | hour | 时 | 输出 | 166 | | minute | 分 | 输出 | 167 | | second | 秒 | 输出 | 168 | 169 | #### 返回值 170 | 171 | | 返回值 | 描述 | 172 | | :---- | :----| 173 | | 0 | 成功 | 174 | | 非0 | 失败 | 175 | 176 | ### rtc\_tick\_irq\_register 177 | 178 | #### 描述 179 | 180 | 设置RTC tick中断,可以设置整秒、整分、整时、整天中断。 181 | 182 | #### 函数原型 183 | 184 | ```c 185 | int rtc_tick_irq_register(bool is_single_shot, rtc_tick_interrupt_mode_t mode, plic_irq_callback_t callback, void *ctx, uint8_t priority) 186 | ``` 187 | 188 | #### 参数 189 | 190 | | 参数名称 | 描述 | 输入输出 | 191 | | :-------------------------------- | :------------------------------------------- | :-------- | 192 | | is_single_shot | 是否单次触发 | 输入 | 193 | | mode | 中断触发模式 | 输入 | 194 | | callback | 回调函数 | 输入 | 195 | | ctx | 回调函数参数 | 输入 | 196 | | priority | 优先级 | 输入 | 197 | 198 | #### 返回值 199 | 200 | | 返回值 | 描述 | 201 | | :---- | :----| 202 | | 0 | 成功 | 203 | | 非0 | 失败 | 204 | 205 | ### rtc\_tick\_irq\_unregister 206 | 207 | #### 描述 208 | 209 | 注销tick中断。 210 | 211 | #### 函数原型 212 | 213 | ```c 214 | void rtc_tick_irq_unregister(void); 215 | ``` 216 | 217 | #### 参数 218 | 219 | 无。 220 | 221 | #### 返回值 222 | 223 | 无。 224 | 225 | ### rtc\_alarm\_irq\_register 226 | 227 | #### 描述 228 | 229 | 注册alarm中断。 230 | 231 | #### 函数原型 232 | 233 | ```c 234 | int rtc_alarm_irq_register(bool is_single_shot, rtc_mask_t mask, plic_irq_callback_t callback, void *ctx, uint8_t priority) 235 | ``` 236 | 237 | #### 参数 238 | 239 | | 参数名称 | 描述 | 输入输出 | 240 | | :-------------------------------- | :------------------------------------------- | :-------- | 241 | | is_single_shot | 是否单次触发 | 输入 | 242 | | mask | alarm中断掩码,用于灵活配置中断触发方式 | 输入 | 243 | | callback | 回调函数 | 输入 | 244 | | ctx | 回调函数参数 | 输入 | 245 | | priority | 优先级 | 输入 | 246 | 247 | #### 返回值 248 | 249 | | 返回值 | 描述 | 250 | | :---- | :----| 251 | | 0 | 成功 | 252 | | 非0 | 失败 | 253 | 254 | ### rtc\_alarm\_irq\_unregister 255 | 256 | #### 描述 257 | 258 | 注销alarm中断。 259 | 260 | #### 函数原型 261 | 262 | ```c 263 | void rtc_alarm_irq_unregister(void) 264 | ``` 265 | 266 | #### 参数 267 | 268 | 无。 269 | 270 | #### 返回值 271 | 272 | 无。 273 | 274 | ### 举例 275 | 276 | ```c 277 | 278 | int tick_irq(void *ctx) 279 | { 280 | printk("%s\n", __func__); 281 | return 0; 282 | } 283 | 284 | int alarm_irq(void *ctx) 285 | { 286 | printk("%s\n", __func__); 287 | return 0; 288 | } 289 | 290 | 291 | rtc_init(); 292 | rtc_timer_set(2019, 5, 7, 15, 4, 55); 293 | rtc_tick_irq_register(true, RTC_INT_MINUTE, tick_irq, NULL, 1); 294 | 295 | rtc_alarm_set(2019, 5, 7, 15, 5, 5); 296 | rtc_mask_t mask = (rtc_mask_t) 297 | { 298 | .second = 0, 299 | .minute = 1, 300 | .hour = 1, 301 | .day = 1, 302 | .month = 1, 303 | .year = 1, 304 | }; 305 | rtc_alarm_irq_register(true, mask, alarm_irq, NULL, 1); 306 | int year; 307 | int month; 308 | int day; 309 | int hour; 310 | int minute; 311 | int second; 312 | rtc_timer_get(&year, &month, &day, &hour, &minute, &second); 313 | printf("%4d-%d-%d %d:%d:%d\n", year, month, day, hour, minute, second); 314 | ``` -------------------------------------------------------------------------------- /en/FFT.md: -------------------------------------------------------------------------------- 1 | # FFT 2 | 3 | ## Overview 4 | 5 | Fast Fourier Transform (FFT) Accelerator. 6 | 7 | The FFT accelerator implements the radix-2 decimation-in-time (DIT) 8 | Cooley–Tukey FFT algorithm[^cooley_tukey] acceleration in hardware. 9 | 10 | [^cooley_tukey]: https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm 11 | 12 | ## Features 13 | 14 | The FFT accelerator currently supports 64-point, 128-point, 256-point, 15 | and 512-point FFTs and IFFTs. Inside the FFT accelerator, there are two SRAMs 16 | with a size of 512 * 32 bits. After the configuration is completed, the FFT 17 | sends a TX request to the DMA, and the data sent by the DMA is placed in one of 18 | the SRAMs until the data volume satisfies the current FFT operation needs, and 19 | the FFT operation begins at this point. 20 | The butterfly operation unit reads data from the SRAM which containing the valid 21 | data, and writes the data to another SRAM after the end of the operation. 22 | The next butterfly operation reads the data from the SRAM just written, when the 23 | operation ends write to another SRAM. 24 | This process alternates this way until the entire FFT operation is completed. 25 | 26 | ## API 27 | 28 | Corresponding header file `fft.h` 29 | 30 | Provide the following interfaces 31 | 32 | - [fft\_complex\_uint16\_dma](#fft\_complex\_uint16\_dma) 33 | 34 | ### fft\_complex\_uint16\_dma 35 | 36 | #### Description 37 | 38 | FFT operation. 39 | 40 | #### Function prototype 41 | 42 | ```c 43 | void fft_complex_uint16_dma(dmac_channel_number_t dma_send_channel_num, dmac_channel_number_t dma_receive_channel_num, uint16_t shift, fft_direction_t direction, const uint64_t *input, size_t point_num, uint64_t *output); 44 | ``` 45 | 46 | #### Parameter 47 | 48 | | Parameter name | Description | Input or output | 49 | | :------------------------- | :-------------------------------------------------------------------- | :-------------- | 50 | | dma\_send\_channel\_num | DMA channel number used to send data | Input | 51 | | dma\_receive\_channel\_num | DMA channel number used to receive data | Input | 52 | | shift | Data shift setting[^fft_shift] | Input | 53 | | direction | FFT or IFFT | Input | 54 | | input | Input data sequence, format is RIRI...[^precision] | Input | 55 | | point\_num | The number of data points to be calculated can only be 512/256/128/64 | Input | 56 | | output | The result after the operation. The format is RIRI...[^precision] | Output | 57 | 58 | [^fft_shift]: The 16-bit register (-32768~32767) of the FFT accelerator may 59 | overflow during the operation, and the FFT transform has 9 layers. Shift setting 60 | determines which layer needs to be shifted to prevent overflow, such as 0x1ff 61 | means that 9 layers are all shifted; 0x03 means The first layer and the second 62 | layer are shifted. If it is shifted, the transformed amplitude is not the 63 | amplitude of the normal FFT transform. For the corresponding relationship, refer 64 | to the fft_test test demo program, they contain examples of solving frequency 65 | points, phases, and amplitudes. 66 | 67 | [^precision]: The precision of both the real part and the imaginary part is 16 bit. 68 | 69 | #### Return value 70 | 71 | None. 72 | 73 | ### Example 74 | 75 | ```c 76 | #define FFT_N 512U 77 | #define FFT_FORWARD_SHIFT 0x0U 78 | #define FFT_BACKWARD_SHIFT 0x1ffU 79 | #define PI 3.14159265358979323846 80 | complex_hard_t data_hard[FFT_N] = {0}; 81 | for (i = 0; i < FFT_N; i++) 82 | { 83 | tempf1[0] = 0.3 * cosf(2 * PI * i / FFT_N + PI / 3) * 256; 84 | tempf1[1] = 0.1 * cosf(16 * 2 * PI * i / FFT_N - PI / 9) * 256; 85 | tempf1[2] = 0.5 * cosf((19 * 2 * PI * i / FFT_N) + PI / 6) * 256; 86 | data_hard[i].real = (int16_t)(tempf1[0] + tempf1[1] + tempf1[2] + 10); 87 | data_hard[i].imag = (int16_t)0; 88 | } 89 | for (int i = 0; i < FFT_N / 2; ++i) 90 | { 91 | input_data = (fft_data_t *)&buffer_input[i]; 92 | input_data->R1 = data_hard[2 * i].real; 93 | input_data->I1 = data_hard[2 * i].imag; 94 | input_data->R2 = data_hard[2 * i + 1].real; 95 | input_data->I2 = data_hard[2 * i + 1].imag; 96 | } 97 | fft_complex_uint16_dma(DMAC_CHANNEL0, DMAC_CHANNEL1, FFT_FORWARD_SHIFT, FFT_DIR_FORWARD, buffer_input, FFT_N, buffer_output); 98 | for (i = 0; i < FFT_N / 2; i++) 99 | { 100 | output_data = (fft_data_t*)&buffer_output[i]; 101 | data_hard[2 * i].imag = output_data->I1 ; 102 | data_hard[2 * i].real = output_data->R1 ; 103 | data_hard[2 * i + 1].imag = output_data->I2 ; 104 | data_hard[2 * i + 1].real = output_data->R2 ; 105 | } 106 | for (int i = 0; i < FFT_N / 2; ++i) 107 | { 108 | input_data = (fft_data_t *)&buffer_input[i]; 109 | input_data->R1 = data_hard[2 * i].real; 110 | input_data->I1 = data_hard[2 * i].imag; 111 | input_data->R2 = data_hard[2 * i + 1].real; 112 | input_data->I2 = data_hard[2 * i + 1].imag; 113 | } 114 | fft_complex_uint16_dma(DMAC_CHANNEL0, DMAC_CHANNEL1, FFT_BACKWARD_SHIFT, FFT_DIR_BACKWARD, buffer_input, FFT_N, buffer_output); 115 | for (i = 0; i < FFT_N / 2; i++) 116 | { 117 | output_data = (fft_data_t*)&buffer_output[i]; 118 | data_hard[2 * i].imag = output_data->I1 ; 119 | data_hard[2 * i].real = output_data->R1 ; 120 | data_hard[2 * i + 1].imag = output_data->I2 ; 121 | data_hard[2 * i + 1].real = output_data->R2 ; 122 | } 123 | ``` 124 | 125 | ## Data type 126 | 127 | The relevant data types and data structures are defined as follows: 128 | 129 | - fft\_data\_t: The data format passed in by the FFT operation. 130 | - fft\_direction\_t: FFT transform mode. 131 | 132 | ### fft\_data\_t 133 | 134 | #### Description 135 | 136 | The data format passed in by the FFT operation. 137 | 138 | #### Type definition 139 | 140 | ```c 141 | typedef struct tag_fft_data 142 | { 143 | int16_t I1; 144 | int16_t R1; 145 | int16_t I2; 146 | int16_t R2; 147 | } fft_data_t; 148 | ``` 149 | 150 | #### Enumeration element 151 | 152 | | Element name | Description | 153 | | :----------- | :------------------------------------ | 154 | | I1 | The imaginary part of the first data | 155 | | R1 | The real part of the first data | 156 | | I2 | The imaginary part of the second data | 157 | | R2 | The real part of the second data | 158 | 159 | ### fft\_direction\_t 160 | 161 | #### Description 162 | 163 | FFT transform mode. 164 | 165 | #### Type definition 166 | 167 | ```c 168 | typedef enum _fft_direction 169 | { 170 | FFT_DIR_BACKWARD, 171 | FFT_DIR_FORWARD, 172 | FFT_DIR_MAX, 173 | } fft_direction_t; 174 | ``` 175 | 176 | #### Enumeration element 177 | 178 | | Element name | Description | 179 | | :----------------- | :---------------------------- | 180 | | FFT\_DIR\_BACKWARD | FFT inverse transform (FFT) | 181 | | FFT\_DIR\_FORWARD | FFT positive transform (IFFT) | -------------------------------------------------------------------------------- /zh-Hans/BSP.md: -------------------------------------------------------------------------------- 1 | # 平台相关(BSP) 2 | 3 | ## 概述 4 | 5 | 平台相关的通用函数,核之间锁的相关操作。 6 | 7 | ## 功能描述 8 | 9 | 提供获取当前运行程序的CPU核编号的接口以及启动第二个核的入口。 10 | 11 | ## API 参考 12 | 13 | 对应的头文件 `bsp.h` 14 | 15 | 为用户提供以下接口 16 | 17 | - register\_core1 18 | 19 | - current\_coreid 20 | 21 | - read\_cycle 22 | 23 | - spinlock\_lock 24 | 25 | - spinlock\_unlock 26 | 27 | - spinlock\_trylock 28 | 29 | - corelock\_lock 30 | 31 | - corelock\_trylock 32 | 33 | - corelock\_unlock 34 | 35 | - sys\_register\_putchar 36 | 37 | - sys\_register\_getchar 38 | 39 | - sys\_stdin\_flush 40 | 41 | - get\_free\_heap\_size 42 | 43 | - printk 44 | 45 | ### register\_core1 46 | 47 | #### 描述 48 | 49 | 向1核注册函数,并启动1核。 50 | 51 | #### 函数原型 52 | 53 | ```c 54 | int register_core1(core_function func, void *ctx) 55 | ``` 56 | 57 | #### 参数 58 | 59 | | 参数名称 | 描述 | 输入输出 | 60 | | ------------------------------- | ------------------------ | --------- | 61 | | func | 向1核注册的函数 | 输入 | 62 | | ctx | 函数的参数,没有设置为NULL | 输入 | 63 | 64 | #### 返回值 65 | 66 | | 返回值 | 描述 | 67 | | :---- | :------ | 68 | | 0 | 成功 | 69 | | 非0 | 失败 | 70 | 71 | ### current\_coreid 72 | 73 | #### 描述 74 | 75 | 获取当前CPU核编号。 76 | 77 | #### 函数原型 78 | 79 | ```c 80 | #define current_coreid() read_csr(mhartid) 81 | ``` 82 | 83 | #### 参数 84 | 85 | 无。 86 | 87 | #### 返回值 88 | 89 | 当前所在CPU核的编号。 90 | 91 | #### read\_cycle 92 | 93 | #### 描述 94 | 95 | 获取CPU开机至今的时钟数。可以用使用这个函数精准的确定程序运行时钟。可以配合sysctl\_clock\_get\_freq(SYSCTL\_CLOCK\_CPU)计算运行的时间。 96 | 97 | #### 函数原型 98 | 99 | ```c 100 | #define read_cycle() read_csr(mcycle) 101 | ``` 102 | 103 | #### 参数 104 | 105 | 无。 106 | 107 | #### 返回值 108 | 109 | 开机至今的CPU时钟数。 110 | 111 | ### spinlock\_lock 112 | 113 | #### 描述 114 | 115 | 自旋锁,不可嵌套,不建议在中断使用,中断中可以使用spinlock_trylock。 116 | 117 | #### 函数原型 118 | 119 | ```c 120 | void spinlock_lock(spinlock_t *lock) 121 | ``` 122 | 123 | #### 参数 124 | 125 | 自旋锁,要使用全局变量。 126 | 127 | #### 返回值 128 | 129 | 无。 130 | 131 | ### spinlock\_trylock 132 | 133 | #### 描述 134 | 135 | 获取自旋锁,成功获取锁会返回0,失败返回-1。 136 | 137 | #### 函数原型 138 | 139 | ```c 140 | int spinlock_trylock(spinlock_t *lock) 141 | ``` 142 | 143 | #### 参数 144 | 145 | 自旋锁,要使用全局变量。 146 | 147 | #### 返回值 148 | 149 | | 返回值 | 描述 | 150 | | :---- | :------ | 151 | | 0 | 成功 | 152 | | 非0 | 失败 | 153 | 154 | ### spinlock\_unlock 155 | 156 | #### 描述 157 | 158 | 自旋锁解锁。 159 | 160 | #### 函数原型 161 | 162 | ```c 163 | void spinlock_unlock(spinlock_t *lock) 164 | ``` 165 | 166 | #### 参数 167 | 168 | 核间锁,要使用全局变量,参见举例。 169 | 170 | #### 返回值 171 | 172 | 无。 173 | 174 | ### corelock\_lock 175 | 176 | #### 描述 177 | 178 | 获取核间锁,核之间互斥的锁,同核内该锁会嵌套,只有异核之间会阻塞。不建议在中断使用该函数,中断中可以使用corelock\_trylock。 179 | 180 | #### 函数原型 181 | 182 | ```c 183 | void corelock_lock(corelock_t *lock) 184 | ``` 185 | 186 | #### 参数 187 | 188 | 核间锁,要使用全局变量,参见举例。 189 | 190 | #### 返回值 191 | 192 | 无。 193 | 194 | ### corelock\_trylock 195 | 196 | #### 描述 197 | 198 | 获取核间锁,同核时锁会嵌套,异核时非阻塞。成功获取锁会返回0,失败返回-1。 199 | 200 | #### 函数原型 201 | 202 | ```c 203 | corelock_trylock(corelock_t *lock) 204 | ``` 205 | 206 | #### 参数 207 | 208 | 核间锁,要使用全局变量,参见举例。 209 | 210 | #### 返回值 211 | 212 | | 返回值 | 描述 | 213 | | :---- | :------ | 214 | | 0 | 成功 | 215 | | 非0 | 失败 | 216 | 217 | ### corelock\_unlock 218 | 219 | #### 描述 220 | 221 | 核间锁解锁。 222 | 223 | #### 函数原型 224 | 225 | ```c 226 | void corelock_unlock(corelock_t *lock) 227 | ``` 228 | 229 | #### 参数 230 | 231 | 核间锁,要使用全局变量,参见举例。 232 | 233 | #### 返回值 234 | 235 | 无。 236 | 237 | ### sys\_register\_getchar 238 | 239 | #### 描述 240 | 241 | 注册系统输入回调函数,scanf时会调用该函数。系统默认使用UART3,如果需要修改UART则调用uart_debug_init函数,具体请到uart章节查看该函数。 242 | 243 | #### 函数原型 244 | 245 | ```c 246 | void sys_register_getchar(sys_getchar_t getchar); 247 | ``` 248 | 249 | #### 参数 250 | 251 | | 参数名称 | 描述 | 输入输出 | 252 | | ------------------------------- | ---------------------- | --------- | 253 | | getchar | 回调函数 | 输入 | 254 | 255 | #### 返回值 256 | 257 | 无。 258 | 259 | ### sys\_register\_putchar 260 | 261 | #### 描述 262 | 263 | 注册系统输出回调函数,printf时会调用该函数。系统默认使用UART3,如果需要修改UART则调用uart_debug_init函数,具体请到uart章节查看该函数。 264 | 265 | #### 函数原型 266 | 267 | ```c 268 | void sys_register_putchar(sys_putchar_t putchar) 269 | ``` 270 | 271 | #### 参数 272 | 273 | | 参数名称 | 描述 | 输入输出 | 274 | | ------------------------------- | ---------------------- | --------- | 275 | | putchar | 回调函数 | 输入 | 276 | 277 | #### 返回值 278 | 279 | 无。 280 | 281 | ### sys\_stdin\_flush 282 | 283 | #### 描述 284 | 285 | 清理stdin缓存。 286 | 287 | #### 参数 288 | 289 | 无。 290 | 291 | #### 返回值 292 | 293 | 无。 294 | 295 | ### get\_free\_heap\_size 296 | 297 | #### 描述 298 | 299 | 获取空闲内存大小。 300 | 301 | #### 函数原型 302 | 303 | ```c 304 | size_t get_free_heap_size(void) 305 | ``` 306 | 307 | #### 参数 308 | 309 | 无。 310 | 311 | #### 返回值 312 | 313 | 空闲内存大小。 314 | 315 | ### 举例 316 | 317 | ```c 318 | /* 1核在0核第二次释放锁的时候才会获取到锁,通过读cycle计算时间 */ 319 | #include 320 | #include "bsp.h" 321 | #include 322 | #include "sysctl.h" 323 | 324 | corelock_t lock; 325 | 326 | uint64_t get_time(void) 327 | { 328 | uint64_t v_cycle = read_cycle(); 329 | return v_cycle * 1000000 / sysctl_clock_get_freq(SYSCTL_CLOCK_CPU); 330 | } 331 | 332 | int core1_function(void *ctx) 333 | { 334 | uint64_t core = current_coreid(); 335 | printf("Core %ld Hello world\n", core); 336 | while(1) 337 | { 338 | uint64_t start = get_time(); 339 | corelock_lock(&lock); 340 | printf("Core %ld Hello world\n", core); 341 | sleep(1); 342 | corelock_unlock(&lock); 343 | uint64_t stop = get_time(); 344 | printf("Core %ld lock time is %ld us\n",core, stop - start); 345 | usleep(10); 346 | } 347 | } 348 | 349 | int main(void) 350 | { 351 | uint64_t core = current_coreid(); 352 | printf("Core %ld Hello world\n", core); 353 | register_core1(core1_function, NULL); 354 | while(1) 355 | { 356 | corelock_lock(&lock); 357 | sleep(1); 358 | printf("1> Core %ld sleep 1\n", core); 359 | corelock_lock(&lock); 360 | sleep(2); 361 | printf("2> Core %ld sleep 2\n", core); 362 | printf("2> Core unlock\n"); 363 | corelock_unlock(&lock); 364 | sleep(1); 365 | printf("1> Core unlock\n"); 366 | corelock_unlock(&lock); 367 | usleep(10); 368 | } 369 | } 370 | ``` 371 | 372 | ## 数据类型 373 | 374 | 相关数据类型、数据结构定义如下: 375 | 376 | - core\_function:CPU核调用的函数。 377 | 378 | - spinlock\_t:自旋锁。 379 | 380 | - corelock\_t:核间锁。 381 | 382 | ### core\_function 383 | 384 | #### 描述 385 | 386 | CPU核调用的函数。 387 | 388 | #### 定义 389 | 390 | ```c 391 | typedef int (*core_function)(void *ctx); 392 | ``` 393 | 394 | ### spinlock\_t 395 | 396 | 自旋锁。 397 | 398 | #### 定义 399 | 400 | ```c 401 | typedef struct _spinlock 402 | { 403 | int lock; 404 | } spinlock_t; 405 | ``` 406 | 407 | ### corelock\_t 408 | 409 | 核间锁。 410 | 411 | #### 定义 412 | 413 | ```c 414 | typedef struct _corelock 415 | { 416 | spinlock_t lock; 417 | int count; 418 | int core; 419 | } corelock_t; 420 | ``` -------------------------------------------------------------------------------- /zh-Hans/APU.md: -------------------------------------------------------------------------------- 1 | # 麦克风阵列处理器 (APU) 2 | 3 | ## 概述 4 | 5 | APU 麦克风阵列语音数据加速计算处理器,能够实时计算不同方向的语音延时累加值,通过这个值来判断语音方向,以及选取某一方向的增强语音数据。 6 | 7 | ## 功能描述 8 | 9 | APU 具备以下几个特点: 10 | 11 | - 支持最多八个麦克风的数据 12 | 13 | - 可以实时计算16个方向的语音延时累加值 14 | 15 | - 支持选定方向的增强语音输出 16 | 17 | ## API 参考 18 | 19 | 对应的头文件 `apu.h` 20 | 21 | 为用户提供以下接口 22 | 23 | - apu\_dir\_set\_prev\_fir 24 | 25 | - apu\_dir\_set\_post\_fir 26 | 27 | - apu\_voc\_set\_prev\_fir 28 | 29 | - apu\_voc\_set\_post\_fir 30 | 31 | - apu\_set\_delay 32 | 33 | - apu\_voc\_set\_direction 34 | 35 | - apu\_set\_channel\_enabled 36 | 37 | - apu\_dir\_enable 38 | 39 | - apu\_voc\_enable 40 | 41 | ### apu\_dir\_set\_prev\_fir 42 | 43 | #### 描述 44 | 45 | 在计算各个方向的延时累加值之前的fir滤波系数。 46 | 47 | #### 函数定义 48 | 49 | ```c 50 | void apu_dir_set_prev_fir(uint16_t *fir_coef) 51 | ``` 52 | 53 | #### 参数 54 | 55 | | 参数名称 | 描述 | 输入输出 | 56 | | ------------------------------- | ---------------------- | --------- | 57 | | fir\_coef | 17位滤波系数指针 | 输入 | 58 | 59 | #### 返回值 60 | 61 | 无。 62 | 63 | ### apu\_dir\_set\_post\_fir 64 | 65 | #### 描述 66 | 67 | 在计算各个方向的延时累加值之后的fir滤波系数。 68 | 69 | #### 函数原型 70 | 71 | ```c 72 | void apu_dir_set_post_fir(uint16_t *fir_coef) 73 | ``` 74 | 75 | #### 参数 76 | 77 | | 参数名称 | 描述 | 输入输出 | 78 | | ------------------------------- | ---------------------- | --------- | 79 | | fir_coef | 17位滤波系数指针 | 输入 | 80 | 81 | #### 返回值 82 | 83 | 无。 84 | 85 | ### apu\_voc\_set\_prev\_fir 86 | 87 | #### 描述 88 | 89 | 在计算选定方向的延时累加值之前的fir滤波系数。 90 | 91 | #### 函数原型 92 | 93 | ```c 94 | void apu_voc_set_prev_fir(uint16_t *fir_coef) 95 | ``` 96 | 97 | #### 参数 98 | 99 | | 参数名称 | 描述 | 输入输出 | 100 | | ------------------------------- | ---------------------- | --------- | 101 | | fir\_coef | 17位滤波系数指针 | 输入 | 102 | 103 | #### 返回值 104 | 105 | 无。 106 | 107 | ### apu\_voc\_set\_post\_fir 108 | 109 | #### 描述 110 | 111 | 在计算选定方向的延时累加值之后的fir滤波系数。 112 | 113 | #### 函数原型 114 | 115 | ```c 116 | void apu_voc_set_post_fir(uint16_t *fir_coef) 117 | ``` 118 | 119 | #### 参数 120 | 121 | | 参数名称 | 描述 | 输入输出 | 122 | | ------------------------------- | ---------------------- | --------- | 123 | | fir_coef | 17位滤波系数指针 | 输入 | 124 | 125 | #### 返回值 126 | 127 | 无。 128 | 129 | ### apu\_set\_delay 130 | 131 | #### 描述 132 | 133 | 初始化圆形麦克风阵列板子上麦克风之间的声波延时参数。 134 | 135 | #### 函数原型 136 | 137 | ```c 138 | void apu_set_delay(float R, uint8_t mic_num_a_circle, uint8_t center, float I2s_fs) 139 | ``` 140 | 141 | #### 参数 142 | 143 | | 参数名称 | 描述 | 输入输出 | 144 | | ------------------------------- | ---------------------- | --------- | 145 | | R | 麦克风围成的圆半径 | 输入 | 146 | | mic_num_a_circle | 在圆周上的麦克风个数 | 输入 | 147 | | center | 圆心点上是否有麦克风 | 输入 | 148 | | I2s_fs | 麦克风采样率 | 输入 | 149 | 150 | #### 返回值 151 | 152 | 无。 153 | 154 | ### apu\_voc\_set\_direction 155 | 156 | #### 描述 157 | 158 | 选择语音增强的方向。 159 | 160 | #### 函数原型 161 | 162 | ```c 163 | void apu_voc_set_direction(enum en_bf_dir direction) 164 | ``` 165 | 166 | #### 参数 167 | 168 | | 参数名称 | 描述 | 输入输出 | 169 | | ------------------------------- | ---------------------- | --------- | 170 | | direction | 选择语音增强的方向,取0~15 | 输入 | 171 | 172 | #### 返回值 173 | 174 | 无。 175 | 176 | ### apu\_set\_channel\_enabled 177 | 178 | #### 描述 179 | 180 | 选择使用的麦克风通道,I2S可用4路,每路有左右声道,共8个通道,相应位为1,则选择使用这个通道。 181 | 182 | #### 函数原型 183 | 184 | ```c 185 | void apu_set_channel_enabled(uint8_t channel_bit) 186 | ``` 187 | 188 | #### 参数 189 | 190 | | 参数名称 | 描述 | 输入输出 | 191 | | ------------------------------- | ---------------------- | --------- | 192 | | channel_bit | 相应位为1,则选择使用这个通道。 | 输入 | 193 | 194 | #### 返回值 195 | 196 | 无。 197 | 198 | ### apu\_dir\_enable 199 | 200 | #### 描述 201 | 202 | 使能各个方向的延时累加计算。 203 | 204 | #### 函数原型 205 | 206 | ```c 207 | void apu_dir_enable(void) 208 | ``` 209 | 210 | #### 参数 211 | 212 | 无。 213 | 214 | #### 返回值 215 | 216 | 无。 217 | 218 | ### apu\_voc\_enable 219 | 220 | #### 描述 221 | 222 | 使能选定方向的延时累加计算。 223 | 224 | #### 函数原型 225 | 226 | ```c 227 | void apu_voc_enable(uint8_t enable_flag) 228 | ``` 229 | 230 | #### 参数 231 | 232 | 无。 233 | 234 | #### 返回值 235 | 236 | 无。 237 | 238 | ### 举例 239 | 240 | ```c 241 | uint16_t fir_prev_t[17] = { 242 | 0x8000, 0, 0, 0, 0, 0, 0, 0, 0, 243 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 244 | }; 245 | 246 | apu_dir_set_prev_fir(fir_prev_t); 247 | apu_dir_set_post_fir(fir_post_t); 248 | apu_voc_set_prev_fir(fir_prev_t); 249 | apu_voc_set_post_fir(fir_post_t); 250 | 251 | apu_set_delay(3, 7, 1, 44100); 252 | apu_voc_set_direction(0); 253 | apu_set_channel_enabled(0xff); 254 | 255 | apu_dir_enable(); 256 | apu_voc_enable(1); 257 | ``` 258 | 259 | ## 数据类型 260 | 261 | 相关数据类型、数据结构定义如下: 262 | 263 | - apu\_reg\_t:apu任务结构体。 264 | 265 | ### apu\_reg\_t 266 | 267 | #### 描述 268 | 269 | kpu任务结构体。 270 | 271 | #### 定义 272 | 273 | ```c 274 | typedef struct _apu_reg 275 | { 276 | //0x200 277 | apu_ch_cfg_t bf_ch_cfg_reg; 278 | //0x204 279 | apu_ctl_t bf_ctl_reg; 280 | //0x208 281 | apu_dir_bidx_t bf_dir_bidx[16][2]; 282 | //0x288 283 | apu_fir_coef_t bf_pre_fir0_coef[9]; 284 | //0x2ac 285 | apu_fir_coef_t bf_post_fir0_coef[9]; 286 | //0x2d0 287 | apu_fir_coef_t bf_pre_fir1_coef[9]; 288 | //0x2f4 289 | apu_fir_coef_t bf_post_fir1_coef[9]; 290 | //0x318 291 | apu_dwsz_cfg_t bf_dwsz_cfg_reg; 292 | //0x31c 293 | apu_fft_cfg_t bf_fft_cfg_reg; 294 | // 0x320 295 | volatile uint32_t sobuf_dma_rdata; 296 | // 0x324 297 | volatile uint32_t vobuf_dma_rdata; 298 | /*0x328*/ 299 | apu_int_stat_t bf_int_stat_reg; 300 | /*0x32c*/ 301 | apu_int_mask_t bf_int_mask_reg; 302 | /*0x330*/ 303 | uint32_t saturation_counter; 304 | /*0x334*/ 305 | uint32_t saturation_limits; 306 | } __attribute__((packed, aligned(4))) apu_reg_t; 307 | ``` 308 | 309 | #### 成员 310 | 311 | | 成员名称 | 描述 | 312 | | ---------------------- | ------------------------------------------ | 313 | |bf\_ch\_cfg\_reg | 通道配置 | 314 | |bf\_ctl\_reg | 控制寄存器 | 315 | |bf\_dir\_bidx[16][2] | | 316 | |bf\_pre\_fir0\_coef[9] | 各个方向延时累加计算前滤波系数 | 317 | |bf\_post\_fir0\_coef[9] | 各个方向延时累加计算后滤波系数 | 318 | |bf\_pre\_fir1\_coef[9] | 计算选定方向延时累加值之前滤波系数 | 319 | |bf\_post\_fir1\_coef[9] | 计算选定方向延时累加值之后滤波系数 | 320 | |bf\_dwsz\_cfg\_reg | 下采样系数 | 321 | |bf\_fft\_cfg\_reg | fft控制寄存器 | 322 | |sobuf\_dma\_rdata | 方向数据源地址 | 323 | |vobuf\_dma\_rdata | 选定方向数据源地址 | 324 | |bf\_int\_stat\_reg | 中断状态寄存器 | 325 | |bf\_int\_mask\_reg | 中断选定寄存器 | 326 | |saturation\_counter | | 327 | |saturation\_limits | | 328 | -------------------------------------------------------------------------------- /en/TIMER.md: -------------------------------------------------------------------------------- 1 | # TIMER 2 | 3 | ## Overview 4 | 5 | The timer peripheral provides high-precision timing. 6 | The chip has 3 timers, each with 4 channels. Can be configured as PWM, see PWM description for details. 7 | 8 | ## Features 9 | 10 | The TIMER module has the following features: 11 | 12 | - Enable or disable the timer 13 | - Configure timer trigger interval 14 | - Configure timer trigger handler 15 | 16 | ## API 17 | 18 | Corresponding header file `timer.h` 19 | 20 | Provide the following interfaces 21 | 22 | - timer\_init 23 | 24 | - timer\_set\_interval 25 | 26 | - timer\_set\_irq (deprecated) 27 | 28 | - timer\_set\_enable 29 | 30 | - timer\_irq\_register 31 | 32 | - timer\_irq\_deregister 33 | 34 | ### timer\_init 35 | 36 | #### Description 37 | 38 | Initialize timer. 39 | 40 | #### Function prototype 41 | 42 | ```c 43 | void timer_init(timer_device_number_t timer_number) 44 | ``` 45 | 46 | #### Parameter 47 | 48 | | Parameter name | Description | Input or output | 49 | | :------------- | :----------- | :-------------- | 50 | | timer\_number | Timer number | Input | 51 | 52 | #### Return value 53 | 54 | None. 55 | 56 | ### timer\_set\_interval 57 | 58 | #### Description 59 | 60 | Set the timer trigger interval. 61 | 62 | #### Function prototype 63 | 64 | ```c 65 | size_t timer_set_interval(timer_device_number_t timer_number, timer_channel_number_t channel, size_t nanoseconds) 66 | ``` 67 | 68 | #### Parameter 69 | 70 | | Parameter name | Description | Input or output | 71 | | :------------- | :--------------------- | :-------------- | 72 | | timer\_number | Timer number | Input | 73 | | channel | Timer channel number | Input | 74 | | nanoseconds | Interval (nanoseconds) | Input | 75 | 76 | #### Return value 77 | 78 | Actual trigger interval (nanoseconds). 79 | 80 | ### timer\_set\_irq 81 | 82 | #### Description 83 | 84 | Set the timer to trigger the interrupt callback function. This function is deprecated. The recommended replacement function is timer\_irq\_register. 85 | 86 | #### Function prototype 87 | 88 | ```c 89 | void timer_set_irq(timer_device_number_t timer_number, timer_channel_number_t channel, void(*func)(), uint32_t priority) 90 | ``` 91 | 92 | #### Parameter 93 | 94 | | Parameter name | Description | Input or output | 95 | | :------------- | :------------------- | :-------------- | 96 | | timer\_number | Timer number | Input | 97 | | channel | Timer channel number | Input | 98 | | func | Callback | Input | 99 | | priority | Interrupt priority | Input | 100 | 101 | #### Return value 102 | 103 | None. 104 | 105 | ### timer\_set\_enable 106 | 107 | #### Description 108 | 109 | Enable or disable the timer. 110 | 111 | #### Function prototype 112 | 113 | ```c 114 | void timer_set_enable(timer_device_number_t timer_number, timer_channel_number_t channel, uint32_t enable) 115 | ``` 116 | 117 | #### Parameter 118 | 119 | | Parameter name | Description | Input or output | 120 | | :------------- | :------------------------------------------ | :-------------- | 121 | | timer\_number | Timer number | Input | 122 | | channel | Timer channel number | Input | 123 | | enable | Whether it is enabled, 0: disable 1: enable | Input | 124 | 125 | #### Return value 126 | 127 | None. 128 | 129 | ### timer\_irq\_register 130 | 131 | #### Description 132 | 133 | Register the timer interrupt callback function. 134 | 135 | #### Function prototype 136 | 137 | ```c 138 | int timer_irq_register(timer_device_number_t device, timer_channel_number_t channel, int is_single_shot, uint32_t priority, timer_callback_t callback, void *ctx); 139 | ``` 140 | 141 | #### Parameter 142 | 143 | | Parameter name | Description | Input or output | 144 | | :--------------- | :--------------------------------------- | :-------------- | 145 | | device | Timer number | Input | 146 | | channel | Timer channel number | Input | 147 | | is\_single\_shot | Whether it is a single shot interruption | Input | 148 | | priority | Interrupt priority | Input | 149 | | callback | Interrupt callback function | Input | 150 | | ctx | Callback function parameter | Input | 151 | 152 | #### Return value 153 | 154 | | Return value | Description | 155 | | :----------- | :---------- | 156 | | 0 | Success | 157 | | Others | Fail | 158 | 159 | ### timer\_irq\_deregister 160 | 161 | #### Description 162 | 163 | Deregister the timer interrupt callback function. 164 | 165 | #### Function prototype 166 | 167 | ```c 168 | int timer_irq_deregister(timer_device_number_t device, timer_channel_number_t channel) 169 | ``` 170 | 171 | #### Parameter 172 | 173 | | Parameter name | Description | Input or output | 174 | | :------------- | :------------------- | :-------------- | 175 | | device | Timer number | Input | 176 | | channel | Timer channel number | Input | 177 | 178 | #### Return value 179 | 180 | | Return value | Description | 181 | | :----------- | :---------- | 182 | | 0 | Success | 183 | | Others | Fail | 184 | 185 | ### Example 186 | 187 | ```c 188 | /* Timer 0 Channel 0 timed 1 second print "Time OK!" */ 189 | void irq_time(void) 190 | { 191 | printf("Time OK!\n"); 192 | } 193 | plic_init(); 194 | timer_init(TIMER_DEVICE_0); 195 | timer_set_interval(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1e9); 196 | timer_set_irq(TIMER_DEVICE_0, TIMER_CHANNEL_0, irq_time, 1); 197 | timer_set_enable(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1); 198 | sysctl_enable_irq(); 199 | ``` 200 | 201 | ## Data type 202 | 203 | The relevant data types and data structures are defined as follows: 204 | 205 | - timer\_device\_number_t: Timer number. 206 | 207 | - timer\_channel\_number_t: Timer channel number. 208 | 209 | - timer\_callback\_t: Timer callback function. 210 | 211 | ### timer\_device\_number_t 212 | 213 | #### Description 214 | 215 | Timer number. 216 | 217 | #### Type definition 218 | 219 | ```c 220 | typedef enum _timer_deivce_number 221 | { 222 | TIMER_DEVICE_0, 223 | TIMER_DEVICE_1, 224 | TIMER_DEVICE_2, 225 | TIMER_DEVICE_MAX, 226 | } timer_device_number_t; 227 | ``` 228 | 229 | #### Enumeration element 230 | 231 | | Element name | Description | 232 | | ---------------- | ----------- | 233 | | TIMER\_DEVICE\_0 | Timer 0 | 234 | | TIMER\_DEVICE\_1 | Timer 1 | 235 | | TIMER\_DEVICE\_2 | Timer 2 | 236 | 237 | ### timer\_channel\_number_t 238 | 239 | #### Description 240 | 241 | Timer channel number. 242 | 243 | #### Type definition 244 | 245 | ```c 246 | typedef enum _timer_channel_number 247 | { 248 | TIMER_CHANNEL_0, 249 | TIMER_CHANNEL_1, 250 | TIMER_CHANNEL_2, 251 | TIMER_CHANNEL_3, 252 | TIMER_CHANNEL_MAX, 253 | } timer_channel_number_t; 254 | ``` 255 | 256 | #### Enumeration element 257 | 258 | | Element name | Description | 259 | | ----------------- | --------------- | 260 | | TIMER\_CHANNEL\_0 | Timer channel 0 | 261 | | TIMER\_CHANNEL\_1 | Timer channel 1 | 262 | | TIMER\_CHANNEL\_2 | Timer channel 2 | 263 | | TIMER\_CHANNEL\_3 | Timer channel 3 | 264 | 265 | ### timer\_callback\_t 266 | 267 | #### Description 268 | 269 | Timer callback function. 270 | 271 | #### Type definition 272 | 273 | ```c 274 | typedef int (*timer_callback_t)(void *ctx); 275 | ``` -------------------------------------------------------------------------------- /en/UARTHS.md: -------------------------------------------------------------------------------- 1 | # UARTHS 2 | 3 | ## Overview 4 | 5 | High Speed Universal Asynchronous Receiver/Transmitter (UART). 6 | 7 | Embedded applications typically require a simple method that consumes less system resources to transfer data. The Universal Asynchronous Receiver/Transmitter (UART) meets these requirements with the flexibility to perform full-duplex data exchange with external devices. 8 | 9 | At present, the system uses this high speed serial port as the debugging serial port, and the serial port output is called when using printf. 10 | 11 | ## Features 12 | 13 | The UART peripheral has the following features: 14 | 15 | - Configuring UART parameters 16 | - Automatically charge data to the buffer 17 | - 8-N-1 and 8-N-2 formats: 8 data bits, no parity bit, 1 start 18 | bit, 1 or 2 stop bits 19 | - 8-entry transmit and receive FIFO buffers with programmable 20 | watermark interrupts 21 | - 16× Rx oversampling with 2/3 majority voting per bit 22 | The UART peripheral does not support hardware flow control or 23 | other modem control signals, or synchronous serial data 24 | tranfesrs. 25 | 26 | ## API 27 | 28 | Corresponding header file `uarths.h` 29 | 30 | Provide the following interfaces 31 | 32 | - uarths\_init 33 | 34 | - uarths\_config 35 | 36 | - uarths\_receive\_data 37 | 38 | - uarths\_send\_data 39 | 40 | - uarths\_set\_irq 41 | 42 | - uarths\_get\_interrupt\_mode 43 | 44 | - uarths\_set\_interrupt\_cnt 45 | 46 | ### uarths\_init 47 | 48 | #### Description 49 | 50 | Initialize UARTHS, the system default baud rate is 115200 and 8-N-1 formats (8 data bits, no parity bit, 1 start bit, 1 stop bits). Because the clock source of the uarths is PLL0, you need to call this function to set the baud rate after setting PLL0, otherwise it will print garbled characters. 51 | 52 | #### Function prototype 53 | 54 | ```c 55 | void uarths_init(void) 56 | ``` 57 | 58 | #### Parameter 59 | 60 | None. 61 | 62 | #### Return value 63 | 64 | None. 65 | 66 | ### uarths\_config 67 | 68 | #### Description 69 | 70 | Set the parameters of the UARTHS. Default is 8-N-1 formats (8 data bits, no parity bit, 1 start bit, 1 stop bits). 71 | 72 | #### Function prototype 73 | 74 | ```c 75 | void uarths_config(uint32_t baud_rate, uarths_stopbit_t stopbit) 76 | ``` 77 | 78 | ### Parameter 79 | 80 | | Parameter name | Description | Input or output | 81 | | -------------- | ----------- | --------------- | 82 | | baud\_rate | Baud rate | Input | 83 | | stopbit | Stop bit | Input | 84 | 85 | #### Return value 86 | 87 | None. 88 | 89 | ### uarths\_receive\_data 90 | 91 | #### Description 92 | 93 | Read data through UARTHS. 94 | 95 | #### Function prototype 96 | 97 | ```c 98 | size_t uarths_receive_data(uint8_t *buf, size_t buf_len) 99 | ``` 100 | 101 | #### Parameter 102 | 103 | | Parameter name | Description | Input or output | 104 | | -------------- | ----------------------- | --------------- | 105 | | buf | Receive data | Output | 106 | | buf\_len | Length of received data | Input | 107 | 108 | #### Return value 109 | 110 | The length of the data that has been received. 111 | 112 | ### uarths\_send\_data 113 | 114 | #### Description 115 | 116 | Send data through the UART. 117 | 118 | #### Function prototype 119 | 120 | ```c 121 | size_t uarths_send_data(const uint8_t *buf, size_t buf_len) 122 | ``` 123 | 124 | #### Parameter 125 | 126 | | Parameter name | Description | Input or output | 127 | | -------------- | ------------------------- | --------------- | 128 | | buf | Data to be sent | Input | 129 | | buf\_len | Length of data to be sent | Input | 130 | 131 | #### Return value 132 | 133 | The length of the data that has been sent. 134 | 135 | ### uarths\_set\_irq 136 | 137 | #### Description 138 | 139 | Set the UARTHS interrupt callback function. 140 | 141 | #### Function prototype 142 | 143 | ```c 144 | void uarths_set_irq(uarths_interrupt_mode_t interrupt_mode, plic_irq_callback_t uarths_callback, void *ctx, uint32_t priority) 145 | ``` 146 | 147 | #### Parameter 148 | 149 | | Parameter name | Description | Input or output | 150 | | ---------------- | ---------------------------- | --------------- | 151 | | interrupt\_mode | Interrupt type | Input | 152 | | uarths\_callback | Interrupt callback function | Input | 153 | | ctx | Callback function parameters | Input | 154 | | priority | Interrupt priority | Input | 155 | 156 | #### Return value 157 | 158 | None. 159 | 160 | ### uarths\_get\_interrupt\_mode 161 | 162 | #### Description 163 | 164 | Get the interrupt type of UARTHS. The same interrupt is used by received, sent, or received. 165 | 166 | #### Function prototype 167 | 168 | ```c 169 | uarths_interrupt_mode_t uarths_get_interrupt_mode(void) 170 | ``` 171 | 172 | #### Parameter 173 | 174 | None. 175 | 176 | #### Return value 177 | 178 | The type of current interrupt. 179 | 180 | ### uarths\_set\_interrupt\_cnt 181 | 182 | #### Description 183 | 184 | Set the FIFO depth when the UARTHS interrupt is generated. 185 | When the interrupt type is UARTHS\_SEND\_RECEIVE, the transmit and receive FIFO interrupt depths are both cnt. 186 | 187 | #### Function prototype 188 | 189 | ```c 190 | void uarths_set_interrupt_cnt(uarths_interrupt_mode_t interrupt_mode, uint8_t cnt) 191 | ``` 192 | 193 | #### Parameter 194 | 195 | | Parameter name | Description | Input or output | 196 | | --------------- | -------------- | --------------- | 197 | | interrupt\_mode | Interrupt type | Input | 198 | | cnt | FIFO depth | Input | 199 | 200 | #### Return value 201 | 202 | None. 203 | 204 | ### Example 205 | 206 | ```c 207 | /* 208 | * Set the receive interrupt. The interrupt FIFO depth is 0, that is, the 209 | * received data is immediately interrupted and the received data is read. 210 | */ 211 | int uarths_irq(void *ctx) 212 | { 213 | if(!uarths_receive_data((uint8_t *)&receive_char, 1)) 214 | printf("Uarths receive ERR!\n"); 215 | return 0; 216 | } 217 | 218 | plic_init(); 219 | uarths_set_interrupt_cnt(UARTHS_RECEIVE , 0); 220 | uarths_set_irq(UARTHS_RECEIVE ,uarths_irq, NULL, 4); 221 | sysctl_enable_irq(); 222 | ``` 223 | 224 | ## Data type 225 | 226 | The relevant data types and data structures are defined as follows: 227 | 228 | - uarths\_interrupt\_mode\_t: UARTHS interrupt type. 229 | - uarths\_stopbit\_t: UARTHS stop bit. 230 | 231 | ### uarths\_interrupt\_mode\_t 232 | 233 | ### Description 234 | 235 | UARTHS interrupt type. 236 | 237 | #### Type definition 238 | 239 | ```c 240 | typedef enum _uarths_interrupt_mode 241 | { 242 | UARTHS_SEND = 1, 243 | UARTHS_RECEIVE = 2, 244 | UARTHS_SEND_RECEIVE = 3, 245 | } uarths_interrupt_mode_t; 246 | ``` 247 | 248 | #### Enumeration element 249 | 250 | | Element name | Description | 251 | | --------------------- | ------------------------- | 252 | | UARTHS_SEND | Send interrupt | 253 | | UARTHS_RECEIVE | Receive interrupt | 254 | | UARTHS\_SEND\_RECEIVE | Send or Receive interrupt | 255 | 256 | ### uarths\_stopbit\_t 257 | 258 | #### Description 259 | 260 | UARTHS stop bit. 261 | 262 | #### Type definition 263 | 264 | ```c 265 | typedef enum _uarths_stopbit 266 | { 267 | UART_STOP_1, 268 | UART_STOP_2 269 | } uarths_stopbit_t; 270 | ``` 271 | 272 | #### Enumeration element 273 | 274 | | Element name | Description | 275 | | ------------- | ----------- | 276 | | UART\_STOP\_1 | 1 Stop bit | 277 | | UART\_STOP\_2 | 2 Stop bits | 278 | -------------------------------------------------------------------------------- /zh-Hant/KPU.md: -------------------------------------------------------------------------------- 1 | # 神經網路處理器 (KPU) 2 | 3 | ## 概述 4 | 5 | KPU 是通用的神經網路處理器,它可以在低功耗的情況下實現捲積神經網路計算,實時獲取被檢測目標的大小、坐標和種類,對人臉或者物體進行檢測和分類。 6 | 使用kpu時,必須結合model compiler。 7 | 8 | ## 功能描述 9 | 10 | KPU 具備以下幾個特點: 11 | 12 | - 支持主流訓練框架按照特定限制規則訓練出來的定點化模型 13 | 14 | - 對網路層數無直接限制,支持每層捲積神經網路參數單獨配置,包括輸入輸出通道數目、輸入輸出行寬列高 15 | 16 | - 支持兩種捲積內核 1x1 和 3x3 17 | 18 | - 支持任意形式的激活函數 19 | 20 | - 實時工作時最大支持神經網路參數大小為 5.5MiB 到 5.9MiB 21 | 22 | - 非實時工作時最大支持網路參數大小為(Flash 容量-軟體體積) 23 | 24 | ## API 參考 25 | 26 | 對應的頭文件 `kpu.h` 27 | 28 | 為用戶提供以下介面 29 | 30 | - kpu\_task\_init (0.6.0以後不再支持,請使用kpu\_single\_task\_init) 31 | 32 | - kpu\_run (0.6.0以後不再支持,請使用kpu\_start) 33 | 34 | - kpu\_get\_output\_buf (0.6.0以後不再支持) 35 | 36 | - kpu\_release\_output\_buf (0.6.0以後不再支持) 37 | 38 | - kpu\_start 39 | 40 | - kpu\_single\_task\_init 41 | 42 | - kpu\_single\_task\_deinit 43 | 44 | - kpu\_model\_load\_from\_buffer 45 | 46 | ### kpu\_task\_init 47 | 48 | #### 描述 49 | 50 | 初始化kpu任務句柄,該函數具體實現在model compiler生成的gencode_output.c中。 51 | 52 | #### 函數定義 53 | 54 | ```c 55 | kpu_task_t* kpu_task_init(kpu_task_t* task) 56 | ``` 57 | 58 | #### 參數 59 | 60 | | 參數名稱 | 描述 | 輸入輸出 | 61 | | ------------------------------- | ---------------------- | --------- | 62 | | task | KPU任務句柄 | 輸入 | 63 | 64 | #### 返回值 65 | 66 | KPU任務句柄。 67 | 68 | ### kpu\_run 69 | 70 | #### 描述 71 | 72 | 啟動KPU,進行AI運算。 73 | 74 | #### 函數原型 75 | 76 | ```c 77 | int kpu_run(kpu_task_t* v_task, dmac_channel_number_t dma_ch, const void *src, void* dest, plic_irq_callback_t callback) 78 | ``` 79 | 80 | #### 參數 81 | 82 | | 參數名稱 | 描述 | 輸入輸出 | 83 | | ------------------------------- | ---------------------- | --------- | 84 | | task | KPU任務句柄 | 輸入 | 85 | | dma\_ch | DMA通道 | 輸入 | 86 | | src | 輸入圖像資料 | 輸入 | 87 | | dest | 運算輸出結果 | 輸出 | 88 | | callback | 運算完成回調函數 | 輸入 | 89 | 90 | #### 返回值 91 | 92 | | 返回值 | 描述 | 93 | | :---- | :------------| 94 | | 0 | 成功 | 95 | | 非0 | KPU忙,失敗 | 96 | 97 | ### kpu\_get\_output\_buf 98 | 99 | #### 描述 100 | 101 | 獲取KPU輸出結果的緩存。 102 | 103 | #### 函數原型 104 | 105 | ```c 106 | uint8_t *kpu_get_output_buf(kpu_task_t* task) 107 | ``` 108 | 109 | #### 參數 110 | 111 | | 參數名稱 | 描述 | 輸入輸出 | 112 | | ------------------------------- | ---------------------- | --------- | 113 | | task | KPU任務句柄 | 輸入 | 114 | 115 | #### 返回值 116 | 117 | KPU輸出結果的緩存的指針。 118 | 119 | ### kpu\_release\_output\_buf 120 | 121 | #### 描述 122 | 123 | 釋放KPU輸出結果緩存。 124 | 125 | #### 函數原型 126 | 127 | ```c 128 | void kpu_release_output_buf(uint8_t *output_buf) 129 | ``` 130 | 131 | #### 參數 132 | 133 | | 參數名稱 | 描述 | 輸入輸出 | 134 | | ------------------------------- | ---------------------- | --------- | 135 | | output\_buf | KPU輸出結果緩存 | 輸入 | 136 | 137 | #### 返回值 138 | 139 | 無 140 | 141 | ### kpu\_start 142 | 143 | #### 描述 144 | 145 | 啟動KPU,進行AI運算。 146 | 147 | #### 函數原型 148 | 149 | ```c 150 | int kpu_start(kpu_task_t *task) 151 | ``` 152 | 153 | #### 參數 154 | 155 | | 參數名稱 | 描述 | 輸入輸出 | 156 | | ------------------------------- | ---------------------- | --------- | 157 | | task | KPU任務句柄 | 輸入 | 158 | 159 | #### 返回值 160 | 161 | | 返回值 | 描述 | 162 | | :---- | :------------| 163 | | 0 | 成功 | 164 | | 非0 | KPU忙,失敗 | 165 | 166 | ### kpu\_single\_task\_init 167 | 168 | #### 描述 169 | 170 | 初始化kpu任務句柄。 171 | 172 | #### 函數原型 173 | 174 | ```c 175 | int kpu_single_task_init(kpu_task_t *task) 176 | ``` 177 | 178 | #### 參數 179 | 180 | | 參數名稱 | 描述 | 輸入輸出 | 181 | | ------------------------------- | ---------------------- | --------- | 182 | | task | KPU任務句柄 | 輸入 | 183 | 184 | #### 返回值 185 | 186 | | 返回值 | 描述 | 187 | | :---- | :------------| 188 | | 0 | 成功 | 189 | | 非0 | 失敗 | 190 | 191 | ### kpu\_single\_task\_deinit 192 | 193 | #### 描述 194 | 195 | 註銷kpu任務。 196 | 197 | #### 函數原型 198 | 199 | ```c 200 | int kpu_single_task_deinit(kpu_task_t *task) 201 | ``` 202 | 203 | #### 參數 204 | 205 | | 參數名稱 | 描述 | 輸入輸出 | 206 | | ------------------------------- | ---------------------- | --------- | 207 | | task | KPU任務句柄 | 輸入 | 208 | 209 | #### 返回值 210 | 211 | | 返回值 | 描述 | 212 | | :---- | :------------| 213 | | 0 | 成功 | 214 | | 非0 | 失敗 | 215 | 216 | ### kpu\_model\_load\_from\_buffer 217 | 218 | #### 描述 219 | 220 | 解析kmodel並初始化kpu句柄。 221 | 222 | #### 函數原型 223 | 224 | ```c 225 | int kpu_model_load_from_buffer(kpu_task_t *task, uint8_t *buffer, kpu_model_layer_metadata_t **meta); 226 | ``` 227 | 228 | #### 參數 229 | 230 | | 參數名稱 | 描述 | 輸入輸出 | 231 | | ------------------------------- | ---------------------- | --------- | 232 | | task | KPU任務句柄 | 輸入 | 233 | | buffer | kmodel資料 | 輸入 | 234 | | meta | 內部測試資料,用戶設置為NULL | 輸出 | 235 | 236 | #### 返回值 237 | 238 | | 返回值 | 描述 | 239 | | :---- | :------------| 240 | | 0 | 成功 | 241 | | 非0 | 失敗 | 242 | 243 | ### 舉例 244 | 245 | ```c 246 | /* 通過MC生成kpu_task_gencode_output_init,設置源資料為g_ai_buf,使用DMA5,kpu完成後調用ai_done函數 */ 247 | kpu_task_t task; 248 | volatile uint8_t g_ai_done_flag; 249 | static int ai_done(void *ctx) 250 | { 251 | g_ai_done_flag = 1; 252 | return 0; 253 | } 254 | 255 | /* 初始化kpu */ 256 | kpu_task_gencode_output_init(&task); /* MC生成的函數 */ 257 | task.src = g_ai_buf; 258 | task.dma_ch = 5; 259 | task.callback = ai_done; 260 | kpu_single_task_init(&task); 261 | 262 | /* 啟動kpu */ 263 | kpu_start(&task); 264 | ``` 265 | 266 | ## 資料類型 267 | 268 | 相關資料類型、資料結構定義如下: 269 | 270 | - kpu\_task\_t:kpu任務結構體。 271 | 272 | ### kpu\_task\_t 273 | 274 | #### 描述 275 | 276 | kpu任務結構體。 277 | 278 | #### 定義 279 | 280 | ```c 281 | typedef struct 282 | { 283 | kpu_layer_argument_t *layers; 284 | kpu_layer_argument_t *remain_layers; 285 | plic_irq_callback_t callback; 286 | void *ctx; 287 | uint64_t *src; 288 | uint64_t *dst; 289 | uint32_t src_length; 290 | uint32_t dst_length; 291 | uint32_t layers_length; 292 | uint32_t remain_layers_length; 293 | dmac_channel_number_t dma_ch; 294 | uint32_t eight_bit_mode; 295 | float output_scale; 296 | float output_bias; 297 | float input_scale; 298 | float input_bias; 299 | } kpu_task_t; 300 | ``` 301 | 302 | #### 成員 303 | 304 | | 成員名稱 | 描述 | 305 | | ---------------------- | ------------------------------------------ | 306 | | layers | KPU參數指針(MC初始化,用戶不必關心) | 307 | | remain\_layers | KPU參數指針(運算過程中使用,用戶不必關心) | 308 | | callback | 運算完成回調函數(需要用戶設置) | 309 | | ctx | 回調函數的參數(非空需要用戶設置) | 310 | | src | 運算源資料(需要用戶設置) | 311 | | dst | 運算結果輸出指針(KPU初始化賦值,用戶不必關心) | 312 | | src\_length | 源資料長度(MC初始化,用戶不必關心) | 313 | | dst\_length | 運算結果長度(MC初始化,用戶不必關心) | 314 | | layers\_length | 層數(MC初始化,用戶不必關心) | 315 | | remain\_layers\_length | 剩餘層數(運算過程中使用,用戶不必關心) | 316 | | dma\_ch | 使用的DMA通道號(需要用戶設置) | 317 | | eight\_bit\_mode | 是否是8比特模式(MC初始化,用戶不必關心) | 318 | | output\_scale | 輸出scale值(MC初始化,用戶不必關心) | 319 | | output\_bias | 輸出bias值(MC初始化,用戶不必關心) | 320 | | input\_scale | 輸入scale值(MC初始化,用戶不必關心) | 321 | | input\_bias | 輸入bias值(MC初始化,用戶不必關心) | 322 | -------------------------------------------------------------------------------- /zh-Hans/I2C.md: -------------------------------------------------------------------------------- 1 | # 集成电路内置总线(I²C) 2 | 3 | ## 概述 4 | 5 | I2C 总线用于和多个外部设备进行通信。多个外部设备可以共用一个 I2C 总线。 6 | 7 | ## 功能描述 8 | 9 | I2C 模块具有以下功能: 10 | 11 | - 独立的 I2C 设备封装外设相关参数 12 | - 自动处理多设备总线争用 13 | 14 | ## API参考 15 | 16 | 对应的头文件 `i2c.h` 17 | 18 | 为用户提供以下接口 19 | 20 | - i2c\_init 21 | 22 | - i2c\_init\_as\_slave 23 | 24 | - i2c\_send\_data 25 | 26 | - i2c\_send\_data\_dma 27 | 28 | - i2c\_recv\_data 29 | 30 | - i2c\_recv\_data\_dma 31 | 32 | - i2c\_handle\_data\_dma 33 | 34 | ### i2c\_init 35 | 36 | #### 描述 37 | 38 | 配置 I²C 器件从地址、寄存器位宽度和 I²C 速率。 39 | 40 | #### 函数原型 41 | 42 | ```c 43 | void i2c_init(i2c_device_number_t i2c_num, uint32_t slave_address, uint32_t address_width, uint32_t i2c_clk) 44 | ``` 45 | 46 | #### 参数 47 | 48 | | 参数名称 | 描述 | 输入输出 | 49 | | :-------- | :----- | :----: | 50 | | i2c\_num | I²C号 | 输入 | 51 | | slave\_address | I²C 器件从地址 | 输入| 52 | | address\_width | I²C 器件寄存器宽度(7或10) | 输入 53 | | i2c\_clk | I²C 速率 (Hz) | 输入 | 54 | 55 | #### 返回值 56 | 57 | 无。 58 | 59 | ### i2c\_init\_as\_slave 60 | 61 | #### 描述 62 | 63 | 配置 I²C 为从模式。 64 | 65 | #### 函数原型 66 | 67 | ```c 68 | void i2c_init_as_slave(i2c_device_number_t i2c_num, uint32_t slave_address, uint32_t address_width, const i2c_slave_handler_t *handler) 69 | ``` 70 | 71 | #### 参数 72 | 73 | | 参数名称 | 描述 | 输入输出 | 74 | | :-------- | :----- | :----: | 75 | | i2c\_num | I²C号 | 输入 | 76 | | slave\_address | I²C 从模式的地址 | 输入| 77 | | address\_width | I²C 器件寄存器宽度(7或10) | 输入 78 | | handler | I²C 从模式的中断处理函数 | 输入 | 79 | 80 | #### 返回值 81 | 82 | 无。 83 | 84 | ### i2c\_send\_data 85 | 86 | #### 描述 87 | 88 | 写数据。 89 | 90 | #### 函数原型 91 | 92 | ```c 93 | int i2c_send_data(i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len) 94 | ``` 95 | 96 | #### 参数 97 | 98 | | 参数名称 | 描述 | 输入输出 | 99 | | :--------: | :----- | :----: | 100 | | i2c\_num | I²C号 | 输入 | 101 | | send\_buf | 待传输数据 | 输入 | 102 | | send\_buf\_len | 待传输数据长度 | 输入 | 103 | 104 | #### 返回值 105 | 106 | | 返回值 | 描述 | 107 | | :---- | :----| 108 | | 0 | 成功 | 109 | | 非0 | 失败 | 110 | 111 | ### i2c\_send\_data\_dma 112 | 113 | #### 描述 114 | 115 | 通过DMA写数据。 116 | 117 | #### 函数原型 118 | 119 | ```c 120 | void i2c_send_data_dma(dmac_channel_number_t dma_channel_num, i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len) 121 | ``` 122 | 123 | #### 参数 124 | 125 | | 参数名称 | 描述 | 输入输出 | 126 | | :-------------- | :------------- | :-------- | 127 | | dma\_channel\_num | 使用的dma通道号 | 输入 | 128 | | i2c\_num | I²C号 | 输入 | 129 | | send\_buf | 待传输数据 | 输入 | 130 | | send\_buf\_len | 待传输数据长度 | 输入 | 131 | 132 | #### 返回值 133 | 134 | 无 135 | 136 | ### i2c\_recv\_data 137 | 138 | #### 描述 139 | 140 | 通过CPU读数据。 141 | 142 | #### 函数原型 143 | 144 | ```c 145 | int i2c_recv_data(i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len, uint8_t *receive_buf, size_t receive_buf_len) 146 | ``` 147 | 148 | #### 参数 149 | 150 | | 参数名称 | 描述 | 输入输出 | 151 | | :-------------------- | :----------- | :-------- | 152 | | i2c\_num | I²C 总线号 | 输入 | 153 | | send\_buf | 待传输数据,一般情况是i2c外设的寄存器,如果没有设置为NULL | 输入 | 154 | | send\_buf\_len | 待传输数据长度,如果没有则写0 | 输入 | 155 | | receive\_buf | 接收数据内存 | 输出 | 156 | | receive\_buf\_len | 接收数据的长度 | 输入 | 157 | 158 | #### 返回值 159 | 160 | | 返回值 | 描述 | 161 | | :---- | :----| 162 | | 0 | 成功 | 163 | | 非0 | 失败 | 164 | 165 | ### i2c\_recv\_data\_dma 166 | 167 | #### 描述 168 | 169 | 通过dma读数据。 170 | 171 | #### 函数原型 172 | 173 | ```c 174 | void i2c_recv_data_dma(dmac_channel_number_t dma_send_channel_num, dmac_channel_number_t dma_receive_channel_num, 175 | i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len, uint8_t *receive_buf, size_t receive_buf_len) 176 | ``` 177 | 178 | #### 参数 179 | 180 | | 参数名称 | 描述 | 输入输出 | 181 | | :---------------------- | :------------------ | :------- | 182 | | dma\_send\_channel\_num | 发送数据使用的dma通道 | 输入 | 183 | | dma\_receive\_channel\_num | 接收数据使用的dma通道 | 输入 | 184 | | i2c\_num | I²C 总线号 | 输入 | 185 | | send\_buf | 待传输数据,一般情况是i2c外设的寄存器,如果没有设置为NULL | 输入 | 186 | | send\_buf\_len | 待传输数据长度,如果没有则写0 | 输入 | 187 | | receive\_buf | 接收数据内存 | 输出 | 188 | | receive\_buf\_len | 接收数据的长度 | 输入 | 189 | 190 | #### 返回值 191 | 192 | 无 193 | 194 | ### i2c\_handle\_data\_dma 195 | 196 | #### 描述 197 | 198 | I2C 使用dma传输数据。 199 | 200 | ##### 函数原型 201 | 202 | ```c 203 | void i2c_handle_data_dma(i2c_device_number_t i2c_num, i2c_data_t data, plic_interrupt_t *cb); 204 | ``` 205 | 206 | #### 参数 207 | 208 | | 参数名称 | 描述 | 输入输出 | 209 | | :---------------------- | :------------------ | :------- | 210 | | i2c\_num | I²C 总线号 | 输入 | 211 | | data | I2C数据相关的参数,详见i2c_data_t说明 | 输入 | 212 | | cb | dma中断回调函数,如果设置为NULL则为阻塞模式,直至传输完毕后退出函数 | 输入 | 213 | 214 | #### 返回值 215 | 216 | 无 217 | 218 | ### 举例 219 | 220 | ```c 221 | /* i2c外设地址是0x32, 7位地址,速率200K */ 222 | i2c_init(I2C_DEVICE_0, 0x32, 7, 200000); 223 | uint8_t reg = 0; 224 | uint8_t data_buf[2] = {0x00,0x01} 225 | data_buf[0] = reg; 226 | /* 向0寄存器写0x01 */ 227 | i2c_send_data(I2C_DEVICE_0, data_buf, 2); 228 | i2c_send_data_dma(DMAC_CHANNEL0, I2C_DEVICE_0, data_buf, 4); 229 | /* 从0寄存器读取1字节数据 */ 230 | i2c_receive_data(I2C_DEVICE_0, ®, 1, data_buf, 1); 231 | i2c_receive_data_dma(DMAC_CHANNEL0, DMAC_CHANNEL1, I2C_DEVICE_0,®, 1, data_buf, 1); 232 | ``` 233 | 234 | ## 数据类型 235 | 236 | 相关数据类型、数据结构定义如下: 237 | 238 | - i2c\_device\_number\_t:i2c号。 239 | 240 | - i2c\_slave\_handler\_t:i2c从模式的中断处理函数句柄 241 | 242 | - i2c\_data\_t:使用dma传输时数据相关的参数。 243 | 244 | - i2c\_transfer\_mode\_t:使用DMA传输数据的模式,发送或接收。 245 | 246 | ### i2c\_device\_number_t 247 | 248 | #### 描述 249 | 250 | i2c编号。 251 | 252 | #### 定义 253 | 254 | ```c 255 | typedef enum _i2c_device_number 256 | { 257 | I2C_DEVICE_0, 258 | I2C_DEVICE_1, 259 | I2C_DEVICE_2, 260 | I2C_DEVICE_MAX, 261 | } i2c_device_number_t; 262 | ``` 263 | 264 | ### i2c\_slave\_handler\_t 265 | 266 | #### 描述 267 | 268 | i2c从模式的中断处理函数句柄。根据不同的中断状态执行相应的函数操作。 269 | 270 | #### 定义 271 | 272 | ```c 273 | typedef struct _i2c_slave_handler 274 | { 275 | void(*on_receive)(uint32_t data); 276 | uint32_t(*on_transmit)(); 277 | void(*on_event)(i2c_event_t event); 278 | } i2c_slave_handler_t; 279 | ``` 280 | 281 | #### 成员 282 | 283 | | 成员名称 | 描述 | 284 | | :----- | :--- | 285 | | I2C\_DEVICE\_0 | I2C 0 | 286 | | I2C\_DEVICE\_1 | I2C 1 | 287 | | I2C\_DEVICE\_2 | I2C 2 | 288 | 289 | ### i2c\_data\_t 290 | 291 | #### 描述 292 | 293 | 使用dma传输时数据相关的参数。 294 | 295 | #### 定义 296 | 297 | ```c 298 | typedef struct _i2c_data_t 299 | { 300 | dmac_channel_number_t tx_channel; 301 | dmac_channel_number_t rx_channel; 302 | uint32_t *tx_buf; 303 | size_t tx_len; 304 | uint32_t *rx_buf; 305 | size_t rx_len; 306 | i2c_transfer_mode_t transfer_mode; 307 | } i2c_data_t; 308 | ``` 309 | 310 | #### 成员 311 | 312 | | 成员名称 | 描述 | 313 | | :----------------------------------- | :------------------------------------------ | 314 | | tx\_channel | 发送时使用的DMA通道号 | 315 | | rx\_channel | 发送时使用的DMA通道号 | 316 | | tx\_buf | 发送的数据 | 317 | | tx\_len | 发送数据的长度 | 318 | | rx\_buf | 接收的数据 | 319 | | rx\_len | 接收数据长度 | 320 | | transfer\_mode | 传输模式,发送或接收 | 321 | 322 | ### i2c\_transfer\_mode\_t 323 | 324 | #### 描述 325 | 326 | 使用DMA传输数据的模式,发送或接收。 327 | 328 | #### 定义 329 | 330 | ```c 331 | typedef enum _i2c_transfer_mode 332 | { 333 | I2C_SEND, 334 | I2C_RECEIVE, 335 | } i2c_transfer_mode_t; 336 | ``` 337 | 338 | #### 成员 339 | 340 | | 成员名称 | 描述 | 341 | | :----------------------------------- | :------------------------------------------ | 342 | | I2C\_SEND | 发送 | 343 | | I2C\_RECEIVE | 接收 | -------------------------------------------------------------------------------- /en/I2C.md: -------------------------------------------------------------------------------- 1 | # I²C 2 | 3 | ## Overview 4 | 5 | The I²C (Inter-Integrated Circuit) bus is used to communicate with multiple 6 | external I²C devices. Multiple external I²C devices can share an I²C bus. 7 | 8 | ## Features 9 | 10 | The I²C unit has the following features: 11 | 12 | - Independent I²C controller 13 | - Automatic processing of multi-device bus contention 14 | - Support slave mode 15 | 16 | ## API 17 | 18 | Corresponding header file `i2c.h` 19 | 20 | Provide the following interfaces 21 | 22 | - i2c\_init 23 | 24 | - i2c\_init\_as\_slave 25 | 26 | - i2c\_send\_data 27 | 28 | - i2c\_send\_data\_dma 29 | 30 | - i2c\_recv\_data 31 | 32 | - i2c\_recv\_data\_dma 33 | 34 | ### i2c\_init 35 | 36 | #### Description 37 | 38 | Configure the I²C device slave address, register bit width, and I²C rate. 39 | 40 | #### Function prototype 41 | 42 | ```c 43 | void i2c_init(i2c_device_number_t i2c_num, uint32_t slave_address, uint32_t address_width, uint32_t i2c_clk) 44 | ``` 45 | 46 | #### Parameter 47 | 48 | | Parameter name | Description | Input or output | 49 | | :------------- | :---------------------------------- | :-------------: | 50 | | i2c\_num | I²C number | Input | 51 | | slave\_address | I²C device slave address | Input | 52 | | address\_width | I²C device register width (7 or 10) | Input | 53 | | i2c\_clk | I²C clock rate (Hz) | Input | 54 | 55 | #### Return value 56 | 57 | None. 58 | 59 | ### i2c\_init\_as\_slave 60 | 61 | #### Description 62 | 63 | Configure the I²C controller to be in slave mode. 64 | 65 | #### Function prototype 66 | 67 | ```c 68 | void i2c_init_as_slave(i2c_device_number_t i2c_num, uint32_t slave_address, uint32_t address_width, const i2c_slave_handler_t *handler) 69 | ``` 70 | 71 | #### Parameter 72 | 73 | | Parameter name | Description | Input or output | 74 | | :------------- | :---------------------------------- | :-------------: | 75 | | i2c\_num | I²C number | Input | 76 | | slave\_address | I²C slave address | Input | 77 | | address\_width | I²C device register width (7 or 10) | Input | 78 | | handler | I²C slave interrupt handler | Input | 79 | 80 | #### Return value 81 | 82 | None. 83 | 84 | ### i2c\_send\_data 85 | 86 | #### Description 87 | 88 | Write data. 89 | 90 | #### Function prototype 91 | 92 | ```c 93 | int i2c_send_data(i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len) 94 | ``` 95 | 96 | #### Parameter 97 | 98 | | Parameter name | Description | Input or output | 99 | | :------------: | :------------------------------- | :-------------: | 100 | | i2c\_num | I²C number | Input | 101 | | send\_buf | Data to be transmitted | Input | 102 | | send\_buf\_len | Length of data to be transmitted | Input | 103 | 104 | #### Return value 105 | 106 | | Return value | Description | 107 | | :----------- | :---------- | 108 | | 0 | Success | 109 | | Others | Fail | 110 | 111 | ### i2c\_send\_data\_dma 112 | 113 | #### Description 114 | 115 | Write data through the DMA. 116 | 117 | #### Function prototype 118 | 119 | ```c 120 | void i2c_send_data_dma(dmac_channel_number_t dma_channel_num, i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len) 121 | ``` 122 | 123 | #### Parameter 124 | 125 | | Parameter name | Description | Input or output | 126 | | :---------------- | :------------------------------- | :-------------- | 127 | | dma\_channel\_num | DMA channel number used | Input | 128 | | i2c\_num | I²C number | Input | 129 | | send\_buf | Data to be transmitted | Input | 130 | | send\_buf\_len | Length of data to be transmitted | Input | 131 | 132 | #### Return value 133 | 134 | None. 135 | 136 | ### i2c\_recv\_data 137 | 138 | #### Description 139 | 140 | Read data through the CPU. 141 | 142 | #### Function prototype 143 | 144 | ```c 145 | int i2c_recv_data(i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len, uint8_t *receive_buf, size_t receive_buf_len) 146 | ``` 147 | 148 | #### Parameter 149 | 150 | | Parameter name | Description | Input or output | 151 | | :---------------- | :---------------------------------------------------- | :-------------- | 152 | | i2c\_num | I²C number | Input | 153 | | send\_buf | Data to be transmitted[^device_register] | Input | 154 | | send\_buf\_len | Length of data to be transmitted. If not use, write 0 | Input | 155 | | receive\_buf | Receive data buffer | Output | 156 | | receive\_buf\_len | Length of received data | Input | 157 | 158 | [^device_register]: The general case corresponds to the register of the I²C peripheral, if it is not set to NULL. 159 | 160 | #### Return value 161 | 162 | | Return value | Description | 163 | | :----------- | :---------- | 164 | | 0 | Success | 165 | | Others | Fail | 166 | 167 | ### i2c\_recv\_data\_dma 168 | 169 | #### Description 170 | 171 | Read data through the DMA. 172 | 173 | #### Function prototype 174 | 175 | ```c 176 | void i2c_recv_data_dma(dmac_channel_number_t dma_send_channel_num, dmac_channel_number_t dma_receive_channel_num, 177 | i2c_device_number_t i2c_num, const uint8_t *send_buf, size_t send_buf_len, uint8_t *receive_buf, size_t receive_buf_len) 178 | ``` 179 | 180 | #### Parameter 181 | 182 | | Parameter name | Description | Input or output | 183 | | :------------------------- | :---------------------------------------------------- | :-------------- | 184 | | dma\_send\_channel\_num | Dma channel used to send data | Input | 185 | | dma\_receive\_channel\_num | Dma channel for receiving data | Input | 186 | | i2c\_num | I²C number | Input | 187 | | send\_buf | Data to be transmitted[^device_register] | Input | 188 | | send\_buf\_len | Length of data to be transmitted. If not use, write 0 | Input | 189 | | receive\_buf | Receive data buffer | Output | 190 | | receive\_buf\_len | Length of received data | Input | 191 | 192 | #### Return value 193 | 194 | None. 195 | 196 | ### Example 197 | 198 | ```c 199 | /* The i2c peripheral address is 0x32, 7-bit address, rate 200K */ 200 | i2c_init(I2C_DEVICE_0, 0x32, 7, 200000); 201 | uint8_t reg = 0; 202 | uint8_t data_buf[2] = {0x00,0x01} 203 | data_buf[0] = reg; 204 | /* Write 0x01 to the 0 register */ 205 | i2c_send_data(I2C_DEVICE_0, data_buf, 2); 206 | i2c_send_data_dma(DMAC_CHANNEL0, I2C_DEVICE_0, data_buf, 4); 207 | /* Read 1 byte data from 0 registe */ 208 | i2c_receive_data(I2C_DEVICE_0, ®, 1, data_buf, 1); 209 | i2c_receive_data_dma(DMAC_CHANNEL0, DMAC_CHANNEL1, I2C_DEVICE_0,®, 1, data_buf, 1); 210 | ``` 211 | 212 | ## Data type 213 | 214 | The relevant data types and data structures are defined as follows: 215 | 216 | - i2c\_device\_number\_t: I²C device number. 217 | 218 | - i2c\_slave\_handler\_t: I²C slave mode interrupt handler function handle. 219 | 220 | ### i2c\_device\_number_t 221 | 222 | #### Description 223 | 224 | I²C device number. 225 | 226 | #### Type definition 227 | 228 | ```c 229 | typedef enum _i2c_device_number 230 | { 231 | I2C_DEVICE_0, 232 | I2C_DEVICE_1, 233 | I2C_DEVICE_2, 234 | I2C_DEVICE_MAX, 235 | } i2c_device_number_t; 236 | ``` 237 | 238 | ### i2c\_slave\_handler\_t 239 | 240 | #### Description 241 | 242 | I²C slave mode interrupt handler function handle. 243 | The corresponding function operations are performed according to different interrupt states. 244 | 245 | #### Type definition 246 | 247 | ```c 248 | typedef struct _i2c_slave_handler 249 | { 250 | void(*on_receive)(uint32_t data); 251 | uint32_t(*on_transmit)(); 252 | void(*on_event)(i2c_event_t event); 253 | } i2c_slave_handler_t; 254 | ``` 255 | 256 | #### Enumeration element 257 | 258 | | Element name | Description | 259 | | :------------- | :---------- | 260 | | I2C\_DEVICE\_0 | I²C 0 | 261 | | I2C\_DEVICE\_1 | I²C 1 | 262 | | I2C\_DEVICE\_2 | I²C 2 | 263 | -------------------------------------------------------------------------------- /zh-Hans/DMAC.md: -------------------------------------------------------------------------------- 1 | # 直接内存存取控制器(DMAC) 2 | 3 | ## 概述 4 | 5 | 直接存储访问 (Direct Memory Access, DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据,从而提高了CPU 的效率。 6 | 7 | ## 功能描述 8 | 9 | DMA 模块具有以下功能: 10 | 11 | - 自动选择一路空闲的 DMA 通道用于传输 12 | - 根据源地址和目标地址自动选择软件或硬件握手协议 13 | - 支持 1、2、4、8 字节的元素大小,源和目标大小不必一致 14 | - 异步或同步传输功能 15 | - 循环传输功能,常用于刷新屏幕或音频录放等场景 16 | 17 | ## API 参考 18 | 19 | 对应的头文件 `dmac.h` 20 | 21 | 为用户提供以下接口 22 | 23 | - dmac\_init 24 | 25 | - dmac\_set\_single\_mode 26 | 27 | - dmac\_is\_done 28 | 29 | - dmac\_wait\_done 30 | 31 | - dmac\_set\_irq 32 | 33 | - dmac\_set\_src\_dest\_length 34 | 35 | - dmac\_is\_idle 36 | 37 | - dmac\_wait\_idle 38 | 39 | ### dmac\_init 40 | 41 | #### 描述 42 | 43 | 初始化DMA。 44 | 45 | #### 函数原型 46 | 47 | ```c 48 | void dmac_init(void) 49 | ``` 50 | 51 | #### 参数 52 | 53 | 无。 54 | 55 | #### 返回值 56 | 57 | 无。 58 | 59 | ### dmac\_set\_single\_mode 60 | 61 | #### 描述 62 | 63 | 设置单路DMA参数。 64 | 65 | #### 函数原型 66 | 67 | ```c 68 | void dmac_set_single_mode(dmac_channel_number_t channel_num, const void *src, void *dest, dmac_address_increment_t src_inc, dmac_address_increment_t dest_inc, dmac_burst_trans_length_t dmac_burst_size, dmac_transfer_width_t dmac_trans_width, size_t block_size) 69 | ``` 70 | 71 | #### 参数 72 | 73 | | 参数名称 | 描述 | 输入输出 | 74 | | ------------------------------- | ---------------------- | --------- | 75 | | channel_num | DMA 通道号 | 输入 | 76 | | src | 源地址 | 输入 | 77 | | dest | 目标地址 | 输出 | 78 | | src\_inc | 源地址是否自增 | 输入 | 79 | | dest\_inc | 目标地址是否自增 | 输入 | 80 | | dmac\_burst\_size | 突发传输数量 | 输入 | 81 | | dmac\_trans\_width | 单次传输数据位宽 | 输入 | 82 | | block\_size | 传输数据的个数 | 输入 | 83 | 84 | #### 返回值 85 | 86 | 无。 87 | 88 | ### dmac\_is\_done 89 | 90 | #### 描述 91 | 92 | 用于DMAC启动后判断是否完成传输。用于DMAC启动传输后,如果在启动前判断会不准确。 93 | 94 | #### 函数原型 95 | 96 | ```c 97 | int dmac_is_done(dmac_channel_number_t channel_num) 98 | ``` 99 | 100 | #### 参数 101 | 102 | | 参数名称 | 描述 | 输入输出 | 103 | | ------------------------------- | ---------------------- | --------- | 104 | | channel\_num | DMA 通道号 | 输入 | 105 | 106 | #### 返回值 107 | 108 | | 返回值 | 描述 | 109 | | :---- | :--------| 110 | | 0 | 未完成 | 111 | | 1 | 已完成 | 112 | 113 | ### dmac\_wait\_done 114 | 115 | #### 描述 116 | 117 | 等待DMA完成工作。 118 | 119 | #### 函数原型 120 | 121 | ```c 122 | void dmac_wait_done(dmac_channel_number_t channel_num) 123 | ``` 124 | 125 | #### 参数 126 | 127 | | 参数名称 | 描述 | 输入输出 | 128 | | ------------------------------- | ---------------------- | --------- | 129 | | channel\_num | DMA 通道号 | 输入 | 130 | 131 | #### 返回值 132 | 133 | 无。 134 | 135 | ### dmac\_set\_irq 136 | 137 | #### 描述 138 | 139 | 设置DMAC中断的回调函数 140 | 141 | #### 函数原型 142 | 143 | ```c 144 | void dmac_set_irq(dmac_channel_number_t channel_num , plic_irq_callback_t dmac_callback, void *ctx, uint32_t priority) 145 | ``` 146 | 147 | #### 参数 148 | 149 | | 参数名称 | 描述 | 输入输出 | 150 | | ----------------------------- | --------------- | --------- | 151 | | channel\_num | DMA 通道号 | 输入 | 152 | | dmac\_callback | 中断回调函数 | 输入 | 153 | | ctx | 回调函数的参数 | 输入 | 154 | | priority | 中断优先级 | 输入 | 155 | 156 | #### 返回值 157 | 158 | 无。 159 | 160 | ### dmac\_set\_src\_dest\_length 161 | 162 | #### 描述 163 | 164 | 设置DMAC的源地址、目的地址和长度,然后启动DMAC传输。如果src为NULL则不设置源地址,dest为NULL则不设置目的地址,len<=0则不设置长度。 165 | 166 | 该函数一般用于DMAC中断中,使DMA继续传输数据,而不必再次设置DMAC的所有参数以节省时间。 167 | 168 | #### 函数原型 169 | 170 | ```c 171 | void dmac_set_src_dest_length(dmac_channel_number_t channel_num, const void *src, void *dest, size_t len) 172 | ``` 173 | 174 | #### 参数 175 | 176 | | 参数名称 | 描述 | 输入输出 | 177 | | ----------------------------- | --------------- | --------- | 178 | | channel\_num | DMA 通道号 | 输入 | 179 | | src | 中断回调函数 | 输入 | 180 | | dest | 回调函数的参数 | 输入 | 181 | | len | 传输长度 | 输入 | 182 | 183 | #### 返回值 184 | 185 | 无。 186 | 187 | ### dmac\_is\_idle 188 | 189 | #### 描述 190 | 191 | 判断DMAC当前通道是否空闲,该函数在传输前和传输后都可以用来判断DMAC状态。 192 | 193 | #### 函数原型 194 | 195 | ```c 196 | int dmac_is_idle(dmac_channel_number_t channel_num) 197 | ``` 198 | 199 | #### 参数 200 | 201 | | 参数名称 | 描述 | 输入输出 | 202 | | ------------------------------- | ---------------------- | --------- | 203 | | channel\_num | DMA 通道号 | 输入 | 204 | 205 | #### 返回值 206 | 207 | | 返回值 | 描述 | 208 | | :---- | :--------| 209 | | 0 | 忙 | 210 | | 1 | 空闲 | 211 | 212 | ### dmac\_wait\_idle 213 | 214 | #### 描述 215 | 216 | 等待DMAC进入空闲状态。 217 | 218 | #### 参数 219 | 220 | | 参数名称 | 描述 | 输入输出 | 221 | | ------------------------------- | ---------------------- | --------- | 222 | | channel_num | DMA 通道号 | 输入 | 223 | 224 | #### 返回值 225 | 226 | 无。 227 | 228 | ### 举例 229 | 230 | ```c 231 | /* I2C通过DMA发送128个int数据 */ 232 | uint32_t buf[128]; 233 | dmac_wait_idle(SYSCTL_DMA_CHANNEL_0); 234 | sysctl_dma_select(SYSCTL_DMA_CHANNEL_0, SYSCTL_DMA_SELECT_I2C0_TX_REQ); 235 | dmac_set_single_mode(SYSCTL_DMA_CHANNEL_0, buf, (void*)(&i2c_adapter->data_cmd), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE, DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, 128); 236 | dmac_wait_done(SYSCTL_DMA_CHANNEL_0); 237 | ``` 238 | 239 | ## 数据类型 240 | 241 | 相关数据类型、数据结构定义如下: 242 | 243 | - dmac\_channel\_number\_t:DMA通道编号。 244 | 245 | - dmac\_address\_increment\_t:地址增长方式。 246 | 247 | - dmac\_burst\_trans\_length\_t:突发传输数量。 248 | 249 | - dmac\_transfer\_width\_t:单次传输数据位数。 250 | 251 | ### dmac\_channel\_number\_t 252 | 253 | #### 描述 254 | 255 | DMA通道编号。 256 | 257 | #### 定义 258 | 259 | ```c 260 | typedef enum _dmac_channel_number 261 | { 262 | DMAC_CHANNEL0 = 0, 263 | DMAC_CHANNEL1 = 1, 264 | DMAC_CHANNEL2 = 2, 265 | DMAC_CHANNEL3 = 3, 266 | DMAC_CHANNEL4 = 4, 267 | DMAC_CHANNEL5 = 5, 268 | DMAC_CHANNEL_MAX 269 | } dmac_channel_number_t; 270 | ``` 271 | 272 | #### 成员 273 | 274 | | 成员名称 | 描述 | 275 | | --------------- | ------------ | 276 | | DMAC\_CHANNEL0 | DMA通道 0 | 277 | | DMAC\_CHANNEL1 | DMA通道 1 | 278 | | DMAC\_CHANNEL2 | DMA通道 2 | 279 | | DMAC\_CHANNEL3 | DMA通道 3 | 280 | | DMAC\_CHANNEL4 | DMA通道 4 | 281 | | DMAC\_CHANNEL5 | DMA通道 5 | 282 | 283 | ### dmac\_address\_increment\_t 284 | 285 | #### 描述 286 | 287 | 地址增长方式。 288 | 289 | #### 定义 290 | 291 | ```c 292 | typedef enum _dmac_address_increment 293 | { 294 | DMAC_ADDR_INCREMENT = 0x0, 295 | DMAC_ADDR_NOCHANGE = 0x1 296 | } dmac_address_increment_t; 297 | ``` 298 | 299 | #### 成员 300 | 301 | | 成员名称 | 描述 | 302 | | ---------------------- | ------------ | 303 | | DMAC\_ADDR\_INCREMENT | 地址自动增长 | 304 | | DMAC\_ADDR\_NOCHANGE | 地址不变 | 305 | 306 | ### dmac\_burst\_trans\_length\_t 307 | 308 | #### 描述 309 | 310 | 突发传输数量。 311 | 312 | #### 定义 313 | 314 | ```c 315 | typedef enum _dmac_burst_trans_length 316 | { 317 | DMAC_MSIZE_1 = 0x0, 318 | DMAC_MSIZE_4 = 0x1, 319 | DMAC_MSIZE_8 = 0x2, 320 | DMAC_MSIZE_16 = 0x3, 321 | DMAC_MSIZE_32 = 0x4, 322 | DMAC_MSIZE_64 = 0x5, 323 | DMAC_MSIZE_128 = 0x6, 324 | DMAC_MSIZE_256 = 0x7 325 | } dmac_burst_trans_length_t; 326 | ``` 327 | 328 | #### 成员 329 | 330 | | 成员名称 | 描述 | 331 | | ----------------- | ----------------- | 332 | | DMAC\_MSIZE\_1 | 单次传输数量乘1 | 333 | | DMAC\_MSIZE\_4 | 单次传输数量乘4 | 334 | | DMAC\_MSIZE\_8 | 单次传输数量乘8 | 335 | | DMAC\_MSIZE\_16 | 单次传输数量乘16 | 336 | | DMAC\_MSIZE\_32 | 单次传输数量乘32 | 337 | | DMAC\_MSIZE\_64 | 单次传输数量乘64 | 338 | | DMAC\_MSIZE\_128 | 单次传输数量乘128 | 339 | | DMAC\_MSIZE\_256 | 单次传输数量乘256 | 340 | 341 | ### dmac\_transfer\_width\_t 342 | 343 | #### 描述 344 | 345 | 单次传输数据位数。 346 | 347 | #### 定义 348 | 349 | ```c 350 | typedef enum _dmac_transfer_width 351 | { 352 | DMAC_TRANS_WIDTH_8 = 0x0, 353 | DMAC_TRANS_WIDTH_16 = 0x1, 354 | DMAC_TRANS_WIDTH_32 = 0x2, 355 | DMAC_TRANS_WIDTH_64 = 0x3, 356 | DMAC_TRANS_WIDTH_128 = 0x4, 357 | DMAC_TRANS_WIDTH_256 = 0x5 358 | } dmac_transfer_width_t; 359 | ``` 360 | 361 | #### 成员 362 | 363 | | 成员名称 | 描述 | 364 | | ----------------------- | ----------------- | 365 | | DMAC\_TRANS\_WIDTH\_8 | 单次传输8位 | 366 | | DMAC\_TRANS\_WIDTH\_16 | 单次传输16位 | 367 | | DMAC\_TRANS\_WIDTH\_32 | 单次传输32位 | 368 | | DMAC\_TRANS\_WIDTH\_64 | 单次传输64位 | 369 | | DMAC\_TRANS\_WIDTH\_128 | 单次传输128位 | 370 | | DMAC\_TRANS\_WIDTH\_256 | 单次传输256位 | -------------------------------------------------------------------------------- /zh-Hant/DMAC.md: -------------------------------------------------------------------------------- 1 | # 直接內部儲存存取控制器(DMAC) 2 | 3 | ## 概述 4 | 5 | 直接存儲訪問 (Direct Memory Access, DMA) 用於在外部裝置與記憶體之間以及記憶體與記憶體之間提供高速資料傳輸。可以在無需任何 CPU 操作的情況下通過 DMA 快速移動資料,從而提高了CPU 的效率。 6 | 7 | ## 功能描述 8 | 9 | DMA 模組具有以下功能: 10 | 11 | - 自動選擇一路空閑的 DMA 通道用於傳輸 12 | - 根據源地址和目標地址自動選擇軟體或硬體握手協議 13 | - 支持 1、2、4、8 位元組的元素大小,源和目標大小不必一致 14 | - 非同步或同步傳輸功能 15 | - 循環傳輸功能,常用於刷新屏幕或音頻錄放等場景 16 | 17 | ## API 參考 18 | 19 | 對應的頭文件 `dmac.h` 20 | 21 | 為用戶提供以下介面 22 | 23 | - dmac\_init 24 | 25 | - dmac\_set\_single\_mode 26 | 27 | - dmac\_is\_done 28 | 29 | - dmac\_wait\_done 30 | 31 | - dmac\_set\_irq 32 | 33 | - dmac\_set\_src\_dest\_length 34 | 35 | - dmac\_is\_idle 36 | 37 | - dmac\_wait\_idle 38 | 39 | ### dmac\_init 40 | 41 | #### 描述 42 | 43 | 初始化DMA。 44 | 45 | #### 函數原型 46 | 47 | ```c 48 | void dmac_init(void) 49 | ``` 50 | 51 | #### 參數 52 | 53 | 無。 54 | 55 | #### 返回值 56 | 57 | 無。 58 | 59 | ### dmac\_set\_single\_mode 60 | 61 | #### 描述 62 | 63 | 設置單路DMA參數。 64 | 65 | #### 函數原型 66 | 67 | ```c 68 | void dmac_set_single_mode(dmac_channel_number_t channel_num, const void *src, void *dest, dmac_address_increment_t src_inc, dmac_address_increment_t dest_inc, dmac_burst_trans_length_t dmac_burst_size, dmac_transfer_width_t dmac_trans_width, size_t block_size) 69 | ``` 70 | 71 | #### 參數 72 | 73 | | 參數名稱 | 描述 | 輸入輸出 | 74 | | ------------------------------- | ---------------------- | --------- | 75 | | channel_num | DMA 通道號 | 輸入 | 76 | | src | 源地址 | 輸入 | 77 | | dest | 目標地址 | 輸出 | 78 | | src\_inc | 源地址是否自增 | 輸入 | 79 | | dest\_inc | 目標地址是否自增 | 輸入 | 80 | | dmac\_burst\_size | 突發傳輸數量 | 輸入 | 81 | | dmac\_trans\_width | 單次傳輸資料位寬 | 輸入 | 82 | | block\_size | 傳輸資料的個數 | 輸入 | 83 | 84 | #### 返回值 85 | 86 | 無。 87 | 88 | ### dmac\_is\_done 89 | 90 | #### 描述 91 | 92 | 用於DMAC啟動後判斷是否完成傳輸。用於DMAC啟動傳輸後,如果在啟動前判斷會不准確。 93 | 94 | #### 函數原型 95 | 96 | ```c 97 | int dmac_is_done(dmac_channel_number_t channel_num) 98 | ``` 99 | 100 | #### 參數 101 | 102 | | 參數名稱 | 描述 | 輸入輸出 | 103 | | ------------------------------- | ---------------------- | --------- | 104 | | channel\_num | DMA 通道號 | 輸入 | 105 | 106 | #### 返回值 107 | 108 | | 返回值 | 描述 | 109 | | :---- | :--------| 110 | | 0 | 未完成 | 111 | | 1 | 已完成 | 112 | 113 | ### dmac\_wait\_done 114 | 115 | #### 描述 116 | 117 | 等待DMA完成工作。 118 | 119 | #### 函數原型 120 | 121 | ```c 122 | void dmac_wait_done(dmac_channel_number_t channel_num) 123 | ``` 124 | 125 | #### 參數 126 | 127 | | 參數名稱 | 描述 | 輸入輸出 | 128 | | ------------------------------- | ---------------------- | --------- | 129 | | channel\_num | DMA 通道號 | 輸入 | 130 | 131 | #### 返回值 132 | 133 | 無。 134 | 135 | ### dmac\_set\_irq 136 | 137 | #### 描述 138 | 139 | 設置DMAC中斷的回調函數 140 | 141 | #### 函數原型 142 | 143 | ```c 144 | void dmac_set_irq(dmac_channel_number_t channel_num , plic_irq_callback_t dmac_callback, void *ctx, uint32_t priority) 145 | ``` 146 | 147 | #### 參數 148 | 149 | | 參數名稱 | 描述 | 輸入輸出 | 150 | | ----------------------------- | --------------- | --------- | 151 | | channel\_num | DMA 通道號 | 輸入 | 152 | | dmac\_callback | 中斷回調函數 | 輸入 | 153 | | ctx | 回調函數的參數 | 輸入 | 154 | | priority | 中斷優先順序 | 輸入 | 155 | 156 | #### 返回值 157 | 158 | 無。 159 | 160 | ### dmac\_set\_src\_dest\_length 161 | 162 | #### 描述 163 | 164 | 設置DMAC的源地址、目的地址和長度,然後啟動DMAC傳輸。如果src為NULL則不設置源地址,dest為NULL則不設置目的地址,len<=0則不設置長度。 165 | 166 | 該函數一般用於DMAC中斷中,使DMA繼續傳輸資料,而不必再次設置DMAC的所有參數以節省時間。 167 | 168 | #### 函數原型 169 | 170 | ```c 171 | void dmac_set_src_dest_length(dmac_channel_number_t channel_num, const void *src, void *dest, size_t len) 172 | ``` 173 | 174 | #### 參數 175 | 176 | | 參數名稱 | 描述 | 輸入輸出 | 177 | | ----------------------------- | --------------- | --------- | 178 | | channel\_num | DMA 通道號 | 輸入 | 179 | | src | 中斷回調函數 | 輸入 | 180 | | dest | 回調函數的參數 | 輸入 | 181 | | len | 傳輸長度 | 輸入 | 182 | 183 | #### 返回值 184 | 185 | 無。 186 | 187 | ### dmac\_is\_idle 188 | 189 | #### 描述 190 | 191 | 判斷DMAC當前通道是否空閑,該函數在傳輸前和傳輸後都可以用來判斷DMAC狀態。 192 | 193 | #### 函數原型 194 | 195 | ```c 196 | int dmac_is_idle(dmac_channel_number_t channel_num) 197 | ``` 198 | 199 | #### 參數 200 | 201 | | 參數名稱 | 描述 | 輸入輸出 | 202 | | ------------------------------- | ---------------------- | --------- | 203 | | channel\_num | DMA 通道號 | 輸入 | 204 | 205 | #### 返回值 206 | 207 | | 返回值 | 描述 | 208 | | :---- | :--------| 209 | | 0 | 忙 | 210 | | 1 | 空閑 | 211 | 212 | ### dmac\_wait\_idle 213 | 214 | #### 描述 215 | 216 | 等待DMAC進入空閑狀態。 217 | 218 | #### 參數 219 | 220 | | 參數名稱 | 描述 | 輸入輸出 | 221 | | ------------------------------- | ---------------------- | --------- | 222 | | channel_num | DMA 通道號 | 輸入 | 223 | 224 | #### 返回值 225 | 226 | 無。 227 | 228 | ### 舉例 229 | 230 | ```c 231 | /* I2C通過DMA發送128個int資料 */ 232 | uint32_t buf[128]; 233 | dmac_wait_idle(SYSCTL_DMA_CHANNEL_0); 234 | sysctl_dma_select(SYSCTL_DMA_CHANNEL_0, SYSCTL_DMA_SELECT_I2C0_TX_REQ); 235 | dmac_set_single_mode(SYSCTL_DMA_CHANNEL_0, buf, (void*)(&i2c_adapter->data_cmd), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE, DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, 128); 236 | dmac_wait_done(SYSCTL_DMA_CHANNEL_0); 237 | ``` 238 | 239 | ## 資料類型 240 | 241 | 相關資料類型、資料結構定義如下: 242 | 243 | - dmac\_channel\_number\_t:DMA通道編號。 244 | 245 | - dmac\_address\_increment\_t:地址增長方式。 246 | 247 | - dmac\_burst\_trans\_length\_t:突發傳輸數量。 248 | 249 | - dmac\_transfer\_width\_t:單次傳輸資料位數。 250 | 251 | ### dmac\_channel\_number\_t 252 | 253 | #### 描述 254 | 255 | DMA通道編號。 256 | 257 | #### 定義 258 | 259 | ```c 260 | typedef enum _dmac_channel_number 261 | { 262 | DMAC_CHANNEL0 = 0, 263 | DMAC_CHANNEL1 = 1, 264 | DMAC_CHANNEL2 = 2, 265 | DMAC_CHANNEL3 = 3, 266 | DMAC_CHANNEL4 = 4, 267 | DMAC_CHANNEL5 = 5, 268 | DMAC_CHANNEL_MAX 269 | } dmac_channel_number_t; 270 | ``` 271 | 272 | #### 成員 273 | 274 | | 成員名稱 | 描述 | 275 | | --------------- | ------------ | 276 | | DMAC\_CHANNEL0 | DMA通道 0 | 277 | | DMAC\_CHANNEL1 | DMA通道 1 | 278 | | DMAC\_CHANNEL2 | DMA通道 2 | 279 | | DMAC\_CHANNEL3 | DMA通道 3 | 280 | | DMAC\_CHANNEL4 | DMA通道 4 | 281 | | DMAC\_CHANNEL5 | DMA通道 5 | 282 | 283 | ### dmac\_address\_increment\_t 284 | 285 | #### 描述 286 | 287 | 地址增長方式。 288 | 289 | #### 定義 290 | 291 | ```c 292 | typedef enum _dmac_address_increment 293 | { 294 | DMAC_ADDR_INCREMENT = 0x0, 295 | DMAC_ADDR_NOCHANGE = 0x1 296 | } dmac_address_increment_t; 297 | ``` 298 | 299 | #### 成員 300 | 301 | | 成員名稱 | 描述 | 302 | | ---------------------- | ------------ | 303 | | DMAC\_ADDR\_INCREMENT | 地址自動增長 | 304 | | DMAC\_ADDR\_NOCHANGE | 地址不變 | 305 | 306 | ### dmac\_burst\_trans\_length\_t 307 | 308 | #### 描述 309 | 310 | 突發傳輸數量。 311 | 312 | #### 定義 313 | 314 | ```c 315 | typedef enum _dmac_burst_trans_length 316 | { 317 | DMAC_MSIZE_1 = 0x0, 318 | DMAC_MSIZE_4 = 0x1, 319 | DMAC_MSIZE_8 = 0x2, 320 | DMAC_MSIZE_16 = 0x3, 321 | DMAC_MSIZE_32 = 0x4, 322 | DMAC_MSIZE_64 = 0x5, 323 | DMAC_MSIZE_128 = 0x6, 324 | DMAC_MSIZE_256 = 0x7 325 | } dmac_burst_trans_length_t; 326 | ``` 327 | 328 | #### 成員 329 | 330 | | 成員名稱 | 描述 | 331 | | ----------------- | ----------------- | 332 | | DMAC\_MSIZE\_1 | 單次傳輸數量乘1 | 333 | | DMAC\_MSIZE\_4 | 單次傳輸數量乘4 | 334 | | DMAC\_MSIZE\_8 | 單次傳輸數量乘8 | 335 | | DMAC\_MSIZE\_16 | 單次傳輸數量乘16 | 336 | | DMAC\_MSIZE\_32 | 單次傳輸數量乘32 | 337 | | DMAC\_MSIZE\_64 | 單次傳輸數量乘64 | 338 | | DMAC\_MSIZE\_128 | 單次傳輸數量乘128 | 339 | | DMAC\_MSIZE\_256 | 單次傳輸數量乘256 | 340 | 341 | ### dmac\_transfer\_width\_t 342 | 343 | #### 描述 344 | 345 | 單次傳輸資料位數。 346 | 347 | #### 定義 348 | 349 | ```c 350 | typedef enum _dmac_transfer_width 351 | { 352 | DMAC_TRANS_WIDTH_8 = 0x0, 353 | DMAC_TRANS_WIDTH_16 = 0x1, 354 | DMAC_TRANS_WIDTH_32 = 0x2, 355 | DMAC_TRANS_WIDTH_64 = 0x3, 356 | DMAC_TRANS_WIDTH_128 = 0x4, 357 | DMAC_TRANS_WIDTH_256 = 0x5 358 | } dmac_transfer_width_t; 359 | ``` 360 | 361 | #### 成員 362 | 363 | | 成員名稱 | 描述 | 364 | | ----------------------- | ----------------- | 365 | | DMAC\_TRANS\_WIDTH\_8 | 單次傳輸8位 | 366 | | DMAC\_TRANS\_WIDTH\_16 | 單次傳輸16位 | 367 | | DMAC\_TRANS\_WIDTH\_32 | 單次傳輸32位 | 368 | | DMAC\_TRANS\_WIDTH\_64 | 單次傳輸64位 | 369 | | DMAC\_TRANS\_WIDTH\_128 | 單次傳輸128位 | 370 | | DMAC\_TRANS\_WIDTH\_256 | 單次傳輸256位 | --------------------------------------------------------------------------------