Последние темы
» Вити больше нет!автор bug19 Пн Фев 20 2023, 19:54
» Собираем оригинальный Орион 128
автор bug19 Пн Фев 20 2023, 19:47
» Проблема плющеного экрана ОРИОНА
автор kanzler Пн Ноя 28 2022, 12:05
» Орион 128 и его клоны возрождение 2019-2022 год
автор kanzler Пн Ноя 28 2022, 12:03
» Электроника КР-04. Информация, документы, фото.
автор kanzler Пн Ноя 28 2022, 12:02
» Новости форума
автор kanzler Пн Ноя 28 2022, 11:52
» Орион-128 НГМД запуск 2021 года
автор matrixplus Сб Сен 10 2022, 17:36
» ПЗУ F800 для РК86
автор ведущий_специалист Сб Сен 10 2022, 10:37
» Микропроцессорная лаборатория "Микролаб К580ИК80", УМК-80, УМПК-80 и др.
автор Электротехник Вт Июл 26 2022, 19:33
» Орион-128 SD карта в Орионе
автор matrixplus Чт Июн 02 2022, 09:00
» 7 Мая. День Радио!
автор Viktor2312 Чт Май 12 2022, 10:58
» Серия: Массовая радио библиотека. МРБ
автор Viktor2312 Ср Май 11 2022, 12:17
» Полезные книги
автор Viktor2312 Пн Май 09 2022, 15:07
» Орион 128 Стандарты портов и системной шины Х2
автор matrixplus Вс Май 08 2022, 23:08
» Орион-128 и Орион ПРО еще раз про блоки питания
автор matrixplus Вс Май 08 2022, 19:09
» Орион-128 Программаторы
автор matrixplus Вс Май 08 2022, 19:02
» Орион ПРО история сборки 2021 до 2022
автор matrixplus Вс Май 08 2022, 18:47
» Анонсы монет (New coin).
автор Viktor2312 Сб Май 07 2022, 23:11
» Хочу свой усилок для квартиры собрать не спеша
автор Viktor2312 Сб Май 07 2022, 19:33
» Амфитон 25у-002С
автор Viktor2312 Сб Май 07 2022, 09:38
» Майнер: T-Rex
автор Viktor2312 Вс Май 01 2022, 09:12
» GoWin. Изучение документации. SUG100-2.6E_Gowin Software User Guide. Среда разработки EDA.
автор Viktor2312 Пн Апр 25 2022, 01:01
» GoWin. Изучение документации. UG286-1.9.1E Gowin Clock User Guide.
автор Viktor2312 Сб Апр 23 2022, 18:22
» GoWin. Documentation Database. Device. GW2A.
автор Viktor2312 Ср Апр 20 2022, 14:08
» GOWIN AEC IP
автор Viktor2312 Ср Апр 20 2022, 12:08
Самые активные пользователи за месяц
Нет пользователей |
Поиск
К210. Общая тема по GPIO. Практика.
RUЭВМ :: Микроконтроллеры :: Модули Kendryte с AI от Canaan :: GPIO/GPIOHS/FPIOA. General Purpose Input Output (Входы/выходы общего назначения)
Страница 1 из 2 • Поделиться
Страница 1 из 2 • 1, 2
К210. Общая тема по GPIO. Практика.
1
Универсальный интерфейс ввода-вывода
(General Purpose Input/Output Interface, GPIO).
(General Purpose Input/Output Interface, GPIO).
Практика.
Последний раз редактировалось: Viktor2312 (Пт Окт 30 2020, 15:14), всего редактировалось 2 раз(а)
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: К210. Общая тема по GPIO. Практика.
2
https://cloud.mail.ru/public/EKM6/wDBoHLoNn
Данный проект мигает 3 светодиодами (настройка периферии, уарта и порта вв) по сути на выводах 23,25,26 идет меандр на 500мС.
Добавлю еще один немаловажный факт. Всего ножек на порт ввода вывода можно проинициализировать 32!!
И на будущее, ознакомиться со всеми функциями периферии ножек можно в файле fpioa.h. Это все, что умеет сдк данного процессора, если и есть какие либо скрытые функции - нам этого не узнать никогда. Как видим - есть 2 оочень навороченных порта SPI, 3 полноценных уарта, потрясающий I2S. Ну и к всеобщей радости добавлено 12 шим портов. Из плюшек есть отладка Jtag, пока не проверял, хоть jlink и имеется.
Немного по схеме - выведено самое необходимое, если проблема с количеством светодиодов - то 2 можно не ставить, кнопки просто необходимы, с помощью них программист зашивает в процессор программу. Перевести процессор в режим программирования просто. Нажимаешь и удерживаешь ресет, нажимаешь и удерживаешь бут. отпускаешь ресет, процессор готов к прошивке. Питания достаточно 5 вольт, ноги 3,3В и 1,8В это ВНУТРЕННИЕ стабилизаторы. Я бы вообще рекомендовал их не трогать, так как по нагрузочной способности их нигде не прочитал.
Последний раз редактировалось: ведущий_специалист (Пт Окт 30 2020, 15:19), всего редактировалось 2 раз(а) (Обоснование : Добавил описание по схеме.)
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
Re: К210. Общая тема по GPIO. Практика.
3
Зачем всё так сложно, мы не можем просто взять один порт и помигать светодиодом на нём. Давайте проще, без уартов, кнопок и всего остального. Для начала нужно что-то совсем простое и элементарное, чтобы понять с чего начинать и как. Возьмём например порт io0 и настроем его как положено. Чтобы понять какие нужны файлы, и вообще чтобы понимать, что да как. Сначала код, думаю он будет прост и вы его по памяти можите набрать. Я всё равно средой ещё не умею пользоваться и посмотреть этот проект по ссылке не смогу. А нужно подробно по действиям, что нажать, для чего мы это нажали, что написать, для чего и почему мы это написали, и скомпилировать, чтобы получить рабочий проект, но только для одного порта, одним светодиодом. То есть по сути, рассмотреть настройку порта на вывод от и до готового такого простейшего проекта.
Потому, что я вот читаю программинг мануал, но не всё понятно, как это сделать в среде разработки, что нужно обязательно настраивать, а что нет. Поэтому нужен максимально простой пример и код пока лучше тут выложить текстом.
Куча файлов и папок, я понятия не имею откуда они взялись, что сними делать и куда их пхать...
А нужно вот с самого начала, как создать проект с нуля, простейший. То есть вот запускаю я среду разработки и что дальше делать, в какой последовательности.
Потому, что я вот читаю программинг мануал, но не всё понятно, как это сделать в среде разработки, что нужно обязательно настраивать, а что нет. Поэтому нужен максимально простой пример и код пока лучше тут выложить текстом.
Куча файлов и папок, я понятия не имею откуда они взялись, что сними делать и куда их пхать...
А нужно вот с самого начала, как создать проект с нуля, простейший. То есть вот запускаю я среду разработки и что дальше делать, в какой последовательности.
Последний раз редактировалось: Viktor2312 (Пт Окт 30 2020, 15:22), всего редактировалось 1 раз(а)
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: К210. Общая тема по GPIO. Практика.
4
Viktor2312 пишет:Зачем всё так сложно, мы не можем просто взять один порт и помигать светодиодом на нём. Давайте проще, без уартов, кнопок и всего остального.
К сожалению проще уже некуда. По уарту процессор нужно прошивать, кнопки переводят процессор в режим загрузки ПО. Светодиоды, по барабану, по сути пример все поясняет, что одним мигать что тремя.
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
Re: К210. Общая тема по GPIO. Практика.
5
Хорошо, вот я запустил среду разработки, что мне нужно сделать, чтобы начать свой проект с нуля ?
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: К210. Общая тема по GPIO. Практика.
6
Вот поэтому , считаю что нужно тогда начать с описания пользования средой программирования и настройкой первого проекта. Если честно, эта среда разрабатывалась для ардуинщиков и по сути 3 тыка мышки и проект готов. Но если пока что разобраться сложно - можно подготовить и это.Viktor2312 пишет: Я всё равно средой ещё не умею пользоваться
Оффтоп, я скорее всего в ближайшие 2 дня ухожу в запой, с понедельника можно начать.
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
Re: К210. Общая тема по GPIO. Практика.
7
Чтобы открыть проект, нужно ткнуть File - Open folder - и показать где лежит папка с проектом.Viktor2312 пишет:Хорошо, вот я запустил среду разработки, что мне нужно сделать, чтобы начать свой проект с нуля ?
То, что Вы показали постом выше, это содержимое той папки, которую нужно подсунуть среде. Platform IO САМА "распхает" все файлы куда да что ей нужно. А то , что проект сам содержит столько папок - я фиг знает, так надо и об этом думать не нужно. Знаю только , что в папке SRC лежат исходники проекта.
Чтобы начать новый проект, жмем на домик внизу слева экрана, смотрим Quick access, там верхняя кнопка +New project, выбираем плату и жмем кнопку финиш.
По сути проект будет готов, добавляем в него майн.с и все готово
Чтобы откомпилировать проект, нужно нажать на галочку рядом с домиком, зашить в плату - нажать на стрелку вправо
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
.
8
Оффтоп, я скорее всего в ближайшие 2 дня ухожу в запой, с понедельника можно начать.
Жаль. А у меня вот э/э рубанули, и в этот, 3-й раз за год надолго, что я посидел посидел часок, и пошёл шампусика пригубил, от нечего делать, но в сб и вс. собирался интенсивно изучать, так как с пн. много работы, времени будет мало свободного. Ну ничего, не последний же день живём, я пока почитаю мануалы, может и разберусь, побольше, чем сейчас. Пока почитаю, что вы постили, подумаю, уверен что я просто сильно туплю в начале, как это обычно, потом сам буду прикалываться над своей глупостью в начале изучения...
Но всё равно. Приятного вам отдыха !
выбираем плату и жмем кнопку финиш.
Вот тут тоже вопрос, а если у нас не конкретная плата, а мы её сами сделали, то что мы будем выбирать ?
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: К210. Общая тема по GPIO. Практика.
9
Совсем не важно, процессор один и тот же. Ядро одинаковое, SDK на всех одна, поэтому можно выбирать любую плату с этим процессором. Отличия скорее всего будут , если мы будем программировать под ардуино, но в этих статьях точно ардуина упоминаться не будет.Viktor2312 пишет:
Вот тут тоже вопрос, а если у нас не конкретная плата, а мы её сами сделали, то что мы будем выбирать ?
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
Re: К210. Общая тема по GPIO. Практика.
10
Viktor2312 пишет:.... но не всё понятно, как это сделать в среде разработки, что нужно обязательно настраивать, а что нет. Поэтому нужен максимально простой пример и код ....
А нужно вот с самого начала, как создать проект с нуля, простейший. То есть вот запускаю я среду разработки и что дальше делать, в какой последовательности.
Тот код что дал - это и есть максимально простой вариант развития. Там ничего лишнего, все что там есть, это уарт и настройка портов. Все остальное кроме портов и уарта это просто нужные вещи в проекте и без них никак. Тем более, что мы же не будем ограничивать себя простым миганием светодиода, а будем развивать периферию дальше.
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
.
11
Для того, чтобы въехать первый проект нужно самому мне создать с объяснением каждой строчки, для чего она, откуда берётся, и что мы делаем когда её добавляем и как она будет работать. Потому что некоторые строчки, слова понятны, а некоторые видел, но не знаю как они работают, поэтому давайте я лучше создам свой проект под вашим чутким руководством, не спеша, по сути ваш test1. Обзову я его MY_TEST_002_LED_UART и буду потихоньку создавать, показывая что я делаю, либо спрашивая как сделать. Пока создам, ...002..., так как уже 001 создал пустой и добавил файл main.c и покажу тут как делал. Пусть будет для памяти, она у меня дырявая вечно всё забываю, возможно ещё кому-то пригодится. Ну и главное вы скажите правильно ли я сделал и всё ли я сделал, или ещё что-то нужно добавить, например файл с расширением .h
Итак запускаю Visual Studio Code
И нажимаю кнопку New Project
Указываю имя проекта, забиваю название платы, чтобы долго не искать, как появляется в списке выбираю нужную плату и нажимаю кнопку Finish. Проект создался со всеми необходимыми папками:
Теперь нажимаю правой кнопкой мыши на папке src и в выпавшем окошке выбираю пункт меню New File
В появившейся строке ввода набираю имя файла main.c и он появляется в соответствующей папке src и можно в поле редактора вводить текст программы:
Вот интересно, правильно ли я всё сделал. Могули я приступать к написанию программы, которая будет в файле main.c и не нужно ли что-то ещё добавлять (хотелось бы пока всю программу делать только в файле main.c) Так как, как я понял, вы сделали все инициалицации в отдельном файле и потом добавили этот файл в маин, но об этом потом, не буду забегать в перёд, пока интересно насчёт того, что сделал на данный момент, правильно или нет, и нужно ли ещё что-то добавлять, на этом этапе ?
Продолжение:
Вопрос.
Могу ли я вот это всё, что ниже, из файла bsp.h разположить непосредственно в файле main.c на данный момент, на данном этапе изучения, или всё же критично иметь этот файл с расширением .h
#ifndef _BOARD_CONFIG_
#define _BOARD_CONFIG_
#include "sysctl.h"
#include "atomic.h"
#include "encoding.h"
#include "entry.h"
#include "printf.h"
#include "syscalls.h"
#include <uarths.h>
#include "gpiohs.h"
#include <sleep.h>
#include <fpioa.h>
#include <plic.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define u16 uint16_t
#define u8 uint8_t
void io_set_power(void);
void system_init(void);
#define Led1_PIN 22
#define Led2_PIN 24
#define Led3_PIN 25
/* power domain set */
#define POWER_BANK0_SELECT SYSCTL_POWER_V33
#define POWER_BANK1_SELECT SYSCTL_POWER_V33
#define POWER_BANK2_SELECT SYSCTL_POWER_V33
#define POWER_BANK3_SELECT SYSCTL_POWER_V33
#define POWER_BANK4_SELECT SYSCTL_POWER_V33
#define POWER_BANK5_SELECT SYSCTL_POWER_V33
#define POWER_BANK6_SELECT SYSCTL_POWER_V33
#define POWER_BANK7_SELECT SYSCTL_POWER_V33
#endif
Итак запускаю Visual Studio Code
И нажимаю кнопку New Project
Указываю имя проекта, забиваю название платы, чтобы долго не искать, как появляется в списке выбираю нужную плату и нажимаю кнопку Finish. Проект создался со всеми необходимыми папками:
Теперь нажимаю правой кнопкой мыши на папке src и в выпавшем окошке выбираю пункт меню New File
В появившейся строке ввода набираю имя файла main.c и он появляется в соответствующей папке src и можно в поле редактора вводить текст программы:
Вот интересно, правильно ли я всё сделал. Могули я приступать к написанию программы, которая будет в файле main.c и не нужно ли что-то ещё добавлять (хотелось бы пока всю программу делать только в файле main.c) Так как, как я понял, вы сделали все инициалицации в отдельном файле и потом добавили этот файл в маин, но об этом потом, не буду забегать в перёд, пока интересно насчёт того, что сделал на данный момент, правильно или нет, и нужно ли ещё что-то добавлять, на этом этапе ?
Продолжение:
Вопрос.
Могу ли я вот это всё, что ниже, из файла bsp.h разположить непосредственно в файле main.c на данный момент, на данном этапе изучения, или всё же критично иметь этот файл с расширением .h
#ifndef _BOARD_CONFIG_
#define _BOARD_CONFIG_
#include "sysctl.h"
#include "atomic.h"
#include "encoding.h"
#include "entry.h"
#include "printf.h"
#include "syscalls.h"
#include <uarths.h>
#include "gpiohs.h"
#include <sleep.h>
#include <fpioa.h>
#include <plic.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define u16 uint16_t
#define u8 uint8_t
void io_set_power(void);
void system_init(void);
#define Led1_PIN 22
#define Led2_PIN 24
#define Led3_PIN 25
/* power domain set */
#define POWER_BANK0_SELECT SYSCTL_POWER_V33
#define POWER_BANK1_SELECT SYSCTL_POWER_V33
#define POWER_BANK2_SELECT SYSCTL_POWER_V33
#define POWER_BANK3_SELECT SYSCTL_POWER_V33
#define POWER_BANK4_SELECT SYSCTL_POWER_V33
#define POWER_BANK5_SELECT SYSCTL_POWER_V33
#define POWER_BANK6_SELECT SYSCTL_POWER_V33
#define POWER_BANK7_SELECT SYSCTL_POWER_V33
#endif
______________________________________________________________________________________
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: К210. Общая тема по GPIO. Практика.
12
Все действия сделаны правильно. То есть проект создан правильно, да и по другому как то и не сделать. Все #include можно прописать и в main.c , опустив #ifndef _BOARD_CONFIG_
#define _BOARD_CONFIG_ и #endif. Я почему раскидал все это по разным файлам, просто для удобочитаемости программы. Накидывать все в main.c "дурной тон" не более. Просто когда пишешь код и программа разрастается на тыщщу строк, согласитесь, в такой каше черт ногу сломит.
#define _BOARD_CONFIG_ и #endif. Я почему раскидал все это по разным файлам, просто для удобочитаемости программы. Накидывать все в main.c "дурной тон" не более. Просто когда пишешь код и программа разрастается на тыщщу строк, согласитесь, в такой каше черт ногу сломит.
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
.
13
#define u16 uint16_t
#define u8 uint8_t
Вот здесь мне понятно, мы сделали то же самое, что и когда дали имена нашим портам вот тут:
#define Led1_PIN 22
#define Led2_PIN 24
#define Led3_PIN 25
Теперь мы в программе будем писать не 22, то есть IO22 наш порт подразумевать, а Led1_PIN и т. д. Так и тут, чтобы не писать каждый раз длинное uint16_t, мы будем писать u16 или u8.
А вот эта конструкция:
#define _BOARD_CONFIG_
Мне не понятна, можете дать по ней краткое пояснение.
Так же хотелось бы краткое пояснение и по этой конструкции, что ниже, для чего она используется:
#ifndef _BOARD_CONFIG_
...
...
#endif
А вот тут больше интересует void я так понимаю, это мы указываем тип, но я не совсем пойму, что это за тип, и как он работает:
void io_set_power(void);
void system_init(void);
Сама конструкция, io_set_power как вроде по смыслу понятна (установка питания портов) и (инициализация системы), но почему с void в начале, а не например int и почему void в скобочках, а не, например, просто (). Можите и это как-то кратенько пояснить.
и почему void в скобочках, а не, например, просто ().
Про это я понял, немного, прочитав свой же конспекс по Си:
Ключевое слово void, которое находится в круглых скобках, означает, что в функцию main не передаётся никаких аргументов. Функции в языке С похожи на подпрограммы. Обычно вы вольны придумывать любые имена для своих функций, но main - особое имя, любая программа начинает свои вычисления с первой инструкции функции main. Обычно main для выполнения своей работы пользуется услугами других функций, одни из них пишутся самим программистом, а другие берутся готовыми из имеющихся в его распоряжении библиотек. Один из способов передачи данных между функциями состоит в том, что функция при обращении к другой функции передаёт ей список значений, называемых аргументами. Этот список берётся в скобки и помещается после имени функции. В нашем примере main определена как функция, которая не ждёт никаких аргументов.
Про установку 3,3 В для питания банков, как вроде понятна...
Я думаю мне при написании моего main.c нужно будет сначала переносить из bsp.h данные, потом из bsp.c и потом из main.c вашего. Это мне нужно для практики и понимания, не думаю, что этот пример у меня разрастётся до 2000 строк...
Ну, итак много вопросов, я пока пойду подумаю, почитаю, вчера ещё заметил, что есть помимо bsp.h ещё и .c файл с таким же названием, там более менее всё понятно, но вопросы есть.
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: К210. Общая тема по GPIO. Практика.
14
void - пусто. если в начале - значит ничего функция не возвращает, элементарные законы си.Viktor2312 пишет:
.....прочитав свой же конспекс по Си:
..... но вопросы есть.
....но почему с void в начале
int func(void) // функция должна возвратить значение но ей ничего из переменных присылать не нужно
пример
int func1(int param) // функция принимает переменную param и должна возвратить число например
int func1(int param)
{
if (param>100) return 100; // возвратим 100 и выйдем из функции
return 0; возвратим 0
}
Тут пока сам по книжке или по примерам не врубишь объясняй не объясняй.... )))
Можно я здесь не буду учить вас языку си? Допустим для Вас я буду гуру в си, но поверте, есть куча людей , которые с удовольствием поучили бы меня )))).
Последний раз редактировалось: ведущий_специалист (Пн Ноя 02 2020, 15:40), всего редактировалось 3 раз(а)
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
Re: К210. Общая тема по GPIO. Практика.
15
Большинство компиляторов не знают что такое u8 поэтому в дефайне мы и прописали что u8 это char а u16 это 16ти битный инт.Viktor2312 пишет:#define u16 uint16_t
#define u8 uint8_t
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
Re: К210. Общая тема по GPIO. Практика.
16
void - пусто. если в начале - значит ничего функция не возвращает, элементарные законы си.
int func(void) // функция должна возвратить значение но ей ничего из переменных присылать не нужно
пример
int func1(int param) // функция принимает переменную param и должна возвратить число например
int func1(int param)
{
if (param>100) return 100; // возвратим 100 и выйдем из функции
return 0; возвратим 0
}
Спасибо, всё понятно и всё встало на свои места. Поверьте я уже и по книжке это прочитал и по своему конспекту, но не было понятно до конца, и вот благодаря вашему примеру, всё окончательно прояснилось и стало понятным. Жизнь намного сложнее, и иногда прочитаешь в справочнике и всё понятно, а иногда остаются сомнения из-за которых трудно двигаться дальше, и один абзац объяснения сильно помогает.
Тут пока сам по книжке или по примерам не врубишь объясняй не объясняй.... )))
Вышло как раз наоборот, по книжке, да и ни одной, не врубался, ваш пример с комментариями всё разяснил. Спасибо.
Можно я здесь не буду учить вас языку си?
Да я уж стараюсь поменьше спрашивать и побольше читать в книжках и инете, чтобы не сильно вас напрягать. Но и вы меня поймите, первый пример, пока всё даётся сложно, то что не знал, интенсивно сейчас учу, то что знал и учил, забылось напрочь. В итоге так же интенсивно сейчас перечитываю. Но пока больше сложность представляет, что я для РС читал, а у нас для МК, и я пока многое не могу понять. Тот же оператор printf ну там мне понятно, написали в скобочках "Привет мир" он и вывел на экран надпись, а тут явно он будет по другому работать, особенно в случае, если у нас из элементов отображения только светодиоды, в общим пытаюсь, стараюсь. Ну а если не спрашивать, то в итоге я встану на каком нибудь месте, и буду долго, нудно топтаться, не понимая и не способным продвигаться дальше, ну постараюсь поменьше спрашивать и побольше искать инфу на стороне...
Большинство компиляторов не знают что такое u8 поэтому в дефайне мы и прописали что u8 это char а u16 это 16ти битный инт.
Ну это вообще гениально, хотел про это спрашивать, одно предложение всё расставило на свои места, я про char и 16ти битный int.
Спасибо за разъяснения, пойду дальше, изучать, думать, вопросов ещё много, но я их должен для начала сформулировать, а может и сам нарою что-то, что и не придётся их задавать...
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: К210. Общая тема по GPIO. Практика.
17
Вот что я накалякал, на данный момет:
Уж не знаю насколько это корректно, так как конкретного плана нет, что и в какой последовательности нужно добавлять, если всё делать в виде одного файла main.c Да и почитать об этом особо негде, чтобы было доходчиво и по пунктикам разжёвано.
#include "sysctl.h" //Добавляем заголовочные файлы
#include "atomic.h"
#include "encoding.h"
#include "entry.h"
#include "printf.h"
#include "syscalls.h"
#include <uarths.h>
#include "gpiohs.h"
#include <sleep.h>
#include <fpioa.h>
#include <plic.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define u16 uint16_t
#define u8 uint8_t
#define Led1_PIN 22
#define Led2_PIN 24
#define Led3_PIN 25
int main(void)
{
system_init(); // Здесь инициализируем все нужные и не нужные аппаратные модули для работы
fpioa_set_function(Led1_PIN, FUNC_GPIOHS22);
fpioa_set_function(Led2_PIN, FUNC_GPIOHS24);
fpioa_set_function(Led3_PIN, FUNC_GPIOHS25);
gpiohs_set_drive_mode(Led1_PIN, GPIO_DM_OUTPUT); //Led1
gpiohs_set_pin(Led1_PIN, GPIO_PV_HIGH);
gpiohs_set_drive_mode(Led2_PIN, GPIO_DM_OUTPUT); //Led2
gpiohs_set_pin(Led2_PIN, GPIO_PV_HIGH);
gpiohs_set_drive_mode(Led3_PIN, GPIO_DM_OUTPUT); //Led3
gpiohs_set_pin(Led3_PIN, GPIO_PV_HIGH);
sysctl_set_power_mode(SYSCTL_POWER_BANK0, SYSCTL_POWER_V33);
sysctl_set_power_mode(SYSCTL_POWER_BANK1, SYSCTL_POWER_V33);
sysctl_set_power_mode(SYSCTL_POWER_BANK2, SYSCTL_POWER_V33);
sysctl_set_power_mode(SYSCTL_POWER_BANK3, SYSCTL_POWER_V33);
sysctl_set_power_mode(SYSCTL_POWER_BANK4, SYSCTL_POWER_V33);
sysctl_set_power_mode(SYSCTL_POWER_BANK5, SYSCTL_POWER_V33);
sysctl_set_power_mode(SYSCTL_POWER_BANK6, SYSCTL_POWER_V33);
sysctl_set_power_mode(SYSCTL_POWER_BANK7, SYSCTL_POWER_V33);
sysctl_pll_set_freq(SYSCTL_PLL0, 800000000UL); // Инициализация частот процессора
sysctl_pll_set_freq(SYSCTL_PLL1, 160000000UL);
sysctl_pll_set_freq(SYSCTL_PLL2, 45158400UL);
uarths_init(); // Инициализация последовательного интерфейса для вывода в UART отл. инф.
plic_init(); // Инициализация прерываний (пока не используются)
io_set_power(); // Настройка портов на напряжение
init_pins(); // Настройка портов
while(1)
{
gpiohs_set_pin(Led1_PIN, GPIO_PV_HIGH); // ножку в единицу
gpiohs_set_pin(Led2_PIN, GPIO_PV_HIGH); // ножку в единицу
gpiohs_set_pin(Led3_PIN, GPIO_PV_HIGH); // ножку в единицу
msleep(100); // Задержка на 100 мc работает при помощи присутствующего файла "sleep.h"
gpiohs_set_pin(Led1_PIN, GPIO_PV_LOW); // ножку в 0
gpiohs_set_pin(Led2_PIN, GPIO_PV_LOW); // ножку в 0
gpiohs_set_pin(Led3_PIN, GPIO_PV_LOW); // ножку в 0
msleep(100);
}
}
Уж не знаю насколько это корректно, так как конкретного плана нет, что и в какой последовательности нужно добавлять, если всё делать в виде одного файла main.c Да и почитать об этом особо негде, чтобы было доходчиво и по пунктикам разжёвано.
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: К210. Общая тема по GPIO. Практика.
18
Все функции, которые вызываются из main должны прописаны выше майн. Если функция находится по тексту ниже main, то она должна быть прописана сверху вот так:
void system_init(void);
у вас же в тексте она вообще отсутствует, что при компиляции вызовет ошибку.
io_set_power(); // Настройка портов на напряжение
init_pins(); // Настройка портов ??
по тексту выше вы проделали это уже , зачем вызывать функцию повторно?
думаю system_init тоже уже не нужен, так как все оттуда переехало в главную функцию
uarths_init(); // Инициализация последовательного интерфейса для вывода в UART отл. инф.
plic_init(); // Инициализация прерываний (пока не используются)
а вот это библиотечные подпрограммы, и их нужно оставить.
void system_init(void);
у вас же в тексте она вообще отсутствует, что при компиляции вызовет ошибку.
io_set_power(); // Настройка портов на напряжение
init_pins(); // Настройка портов ??
по тексту выше вы проделали это уже , зачем вызывать функцию повторно?
думаю system_init тоже уже не нужен, так как все оттуда переехало в главную функцию
uarths_init(); // Инициализация последовательного интерфейса для вывода в UART отл. инф.
plic_init(); // Инициализация прерываний (пока не используются)
а вот это библиотечные подпрограммы, и их нужно оставить.
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: К210. Общая тема по GPIO. Практика.
20
Одна ошибка. Сперва нужно проинициализировать частоту а потом настраивать периферию. Поэтому систем инит надо поместить двумя строками выше
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
Re: К210. Общая тема по GPIO. Практика.
21
Ну что, едем дальше? изучаем пины на вход с подтяжками и прерываниями?
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
.
22
Ну что, едем дальше? изучаем пины на вход с подтяжками и прерываниями?
Можно, хотя у меня ещё по прежнему много вопросов по тому, что мы сделали на данный момент. Да я и не пробовал даже компилировать написанный код, свой, сташшшно. Я где-то читал, но сейчас не помню где, про заголовочные файлы, когда они должны быть в "ххххх.х", а когда в <ххххх.х>, вот хочу этот момент прояснить. К тому же когда я открывал ваш проект test1 они у меня подчёркивались и ругалось что-то на путь, хотелось бы понять, где эти файлы находятся, когда и как мы их добавляли, и другую полезную информацию по ним. Например, описание заголовочных файлов которые идут вместе с микросхемой К210, ведь это по сути те же void имя_функции(void), как с вашим примером, когда я взял и перенёс всё содержимое из заголовочного файла bsp.h и bsp.c в главную функцию main. Вот вопрос, есть где-то какое-то описание этих заголовочных файлов.
Также у вас в примере есть функция, которая не просто void имя_функции(void) написана, а так:
static void имя_функции(void)
а у себя я написал вот без этого static, поэтому хотелось бы и этот момент прояснить.
Так же я сейчас немного ознакамливаюсь с самой микросхемой К210 и с модулем kendryte K210, чтобы лучше представлять, что у нас есть из периферии, что мы имеем внутри ядра, сколько и какой у нас памяти и другие тонкости.
Я готов двигаться дальше, но у меня накопилось много моментов и нюансов, которые я хотел бы прояснить, то есть почитать про них инфу, подумать, переварить и разложить всё по полочкам. Может и услышать от вас какие-то пояснения, они порой или помогают понять сразу или задают направление где копать, чтобы прояснить непонятные моменты.
Как я понял на данный момент, мы инициализировали систему тактирования и установили частоту для трёх ФАПЧ (PLL), вот про это тоже мне хотелось бы почитать более детально, вообще про всю систему тактирования, про наверняка имеющийся для неё заголовочный файл или в какой заголовочный файл входит её описание, мы же та по сути вызываем функцию (подпрограмму) для её инициализации и настройки, но с параметрами.
Потом мы инициализировали и настроили систему ввода-вывода, указали напряжение питания, 3,3 В для всех банков и про эти uint8_t и uint16_t хотелось бы как-то разобраться и почитать или понять, пока просто понял, что мы указали два типа 8-битный (char) и 16-битный (16-разрядный int), второй точно целый, я просто вставил в текст как есть, но как-то не разбирался по этому поводу, для чего, почему и т. д.
Ну и потом, в конце уже помигали самими светодиодиками, опять же при помощи заголовочного файла, и я хотел бы почитать его описание, какие параметры мы можем задавать в скобках, вызывая эту функцию для создания задержки. К тому же я немного не понимаю принцип, ну допустим нам нужно не помигать светодиодом в какой-то момент, тут понятно мы вставим кусочек кода, где переведём порт в лог. 1 сделаем задержку, потом переведём в лог.0 и снова сделаем задержку, так мы по идее мигнём один раз, значит у нас должно быть две задержки, одна это время в течении которого светодиод горит и она же в течении которого светодиод погашен, а вторая, в течении какого времени он будет мигать 10с или 30с или 1 мин. или 10 мин. А если нам нужно чтобы он мигал в течении часа, пока мы выполняем какие-то действия, как это нам сделать, и вот во всём этом я пока как-то до конца не разобрался.
Да и сам Си мне ещё подучить нужно, а то так или по памяти делаю или наугад или просто оставляю как есть, для более детального изучения на потом.
И если и делать, даигаться дальше, хотелось бы чтобы я продолжал этот свой проект, в него добавляя код, то есть пусть и перенося из вашего примера с большим количеством файлов чем только main.c, так у меня немного тоже проясняются некоторые моменты, хотя и опять же начинают лезть вопросы, про .h файл, мы их так же добавляем как main.c и потом начинаем наполнять содержимым, или только .c создаём, то есть вы создали файл .h наполнили его, потом .c и его наполнили, а потом уже сделали main.c или может по другому, почему у него .h и т. д. и т. п...
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
.
23
Во, опять же в своём же конспекте прочитал:
Тогда вопрос остался один, что за единица у нас в скобках ?
while (1)
То есть получается, если что-то, чёрт его знает что равно единице, то у нас выполняется тело цикла, само тело цикла понятно, включили все три светодиода в единицу, подождали, включили в 0, снова подождали, и если, опять, что-то равно 1, хотя, может это указание, сколько раз выполнить тело цикла, но об этом нигде не написано, ну или я пока не нашёл где об этом прочитать...
Ну и конечно остаются не разрешёнными пока все вопросы из предыдущего поста.
Мозг после 2-х дневной перезагрузки, начинает потихоньку подгружать данные, может неспеша и разрешу их все, чтобы понять, запомнить и разложить всё по полочкам, с char пока прочитал, что это символ либо байт, думаю в нашем случае это однозначно байт, то есть 8 бит...
Он работает следующим образом. Проверяется условие в скобках. Если оно истинно (значение fahr меньше или равно upper), то выполняется тело цикла (три инструкции заключённые в фигурные скобки). Затем опять проверяется условие, и если оно истинно, то тело цикла выполняется снова. Когда условие становится ложным (fahr превысило upper), цикл завершается, и вычисления продолжаются с инструкции, следующей за циклом. Поскольку никаких инструкций за циклом нет, кроме return (0); то программа по сути завершает работу.
Тогда вопрос остался один, что за единица у нас в скобках ?
while (1)
То есть получается, если что-то, чёрт его знает что равно единице, то у нас выполняется тело цикла, само тело цикла понятно, включили все три светодиода в единицу, подождали, включили в 0, снова подождали, и если, опять, что-то равно 1, хотя, может это указание, сколько раз выполнить тело цикла, но об этом нигде не написано, ну или я пока не нашёл где об этом прочитать...
Ну и конечно остаются не разрешёнными пока все вопросы из предыдущего поста.
Мозг после 2-х дневной перезагрузки, начинает потихоньку подгружать данные, может неспеша и разрешу их все, чтобы понять, запомнить и разложить всё по полочкам, с char пока прочитал, что это символ либо байт, думаю в нашем случае это однозначно байт, то есть 8 бит...
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: К210. Общая тема по GPIO. Практика.
24
Тут очень просто... бесконечный цикл )))). Из этого вайла не выйдем никогда и низачто.Viktor2312 пишет:
Тогда вопрос остался один, что за единица у нас в скобках ?
while (1)
char всю жизнь был и остается 8ми битнымViktor2312 пишет:.... чтобы понять, запомнить и разложить всё по полочкам, с char пока прочитал, что это символ либо байт, думаю в нашем случае это однозначно байт, то есть 8 бит...
uint8_t - беззнаковая 8ми битная переменная , в данном случае инт = интеджер что значит целая.
uint16_t - то же самое только 16 бит
uint32_t - то же самое только 4 байта = 32 бита.
В случае с последним можно было бы написать unsigned long что по сути должно быть то же самое, но данная запись иногда бывает платформо зависимой, и не исключено что на каком нибудь си для AVR это станет не 32 а 16 бит переменной. (может и бред написал) Но вот например в случае с unsigned int для AVR это будут чистые 16 бит а в случае с stm32 данная запись обозначит 32х битную переменную. Поэтому вот такая разница. Многие сдк процессоров вообще дефайнят типа u8 u16 u32, программист привыкает, переходит на другую платформу а компилятор не знает таких обозначений. так как они не стандартные. Поэтому и пишется что то типа #define u8 char что в переводе на русский 1=1
ведущий_специалист- Мастер+
- Сообщения : 303
Дата регистрации : 2020-10-16
Откуда : Санкт Петербург
.
25
Вечный цикл, это не дело, нам при включении, нужно помигать 3 раза, пусть и всеми светодиодами, как показатель, что инициализация прошла успешно. Поэтому, давайте это сделаем. И мы же можем, 500 указать, вместо 100 мс. а то это слишком быстро ? И где найти описание для этого заголовочного файла ?
Хватит уже перегревать сетки ламп, давайте повеселимся!
Хватит уже перегревать сетки ламп, давайте повеселимся!
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Страница 1 из 2 • 1, 2
RUЭВМ :: Микроконтроллеры :: Модули Kendryte с AI от Canaan :: GPIO/GPIOHS/FPIOA. General Purpose Input Output (Входы/выходы общего назначения)
Страница 1 из 2
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|