Search the Community
Showing results for tags 'Keil'.
-
Недавно перешел с avr на stm32, для начала решил заказать Blue Pill. Нашел у себя дисплей MT-16S2H, почитал доку по нему и набросал код в Keil. Экран загорелся, но ничего на нем не появляется. И никак не могу понять или при инициализации накосячил или же с форматом вывода что-то. Кто работал с подобным, отпишитесь) Настраиваю на работу в 4х битном режиме. Работаю на порте B (PB4-PB7), A0 к B0, E к B1. main.c: #include "main.h" #define SYSLOCK 72000000U #define E1 GPIOB->BSRR |= GPIO_BSRR_BR1 #define E0 GPIOB->BSRR |= GPIO_BSRR_BS1 #define A1 GPIOB->BSRR |= GPIO_BSRR_BR0 #define A0 GPIOB->BSRR |= GPIO_BSRR_BS0 #define LCD_PINS0 GPIOB->BSRR |= (GPIO_BSRR_BS0 | GPIO_BSRR_BS1 | GPIO_BSRR_BS4 | GPIO_BSRR_BS5 | GPIO_BSRR_BS6 | GPIO_BSRR_BS7) #define LED_ON GPIOC->BSRR |= GPIO_BSRR_BR13 #define LED_OFF GPIOC->BSRR |= GPIO_BSRR_BS13 __IO static uint32_t SysTick_CNT = 0; void PORTS_INIT(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPBEN; /*PORTC settings*/ GPIOC->CRH &= GPIO_CRH_CNF13; GPIOC->CRH |= GPIO_CRH_MODE13; /*A0(PB0) & E(BP1) INIT*/ GPIOB->CRL &= GPIO_CRL_CNF0; GPIOB->CRL |= GPIO_CRL_MODE0; GPIOB->CRL &= GPIO_CRL_CNF1; GPIOB->CRL |= GPIO_CRL_MODE1; /*PORTB PB4-PB7 settings*/ GPIOB->CRL &= GPIO_CRL_CNF4; GPIOB->CRL |= GPIO_CRL_MODE4; GPIOB->CRL &= GPIO_CRL_CNF5; GPIOB->CRL |= GPIO_CRL_MODE5; GPIOB->CRL &= GPIO_CRL_CNF6; GPIOB->CRL |= GPIO_CRL_MODE6; GPIOB->CRL &= GPIO_CRL_CNF7; GPIOB->CRL |= GPIO_CRL_MODE7; } void SysTick_INIT(void) { SysTick->LOAD &= ~SysTick_LOAD_RELOAD_Msk; SysTick->LOAD = SYSLOCK/(1000000-1); SysTick->VAL &= ~SysTick_VAL_CURRENT_Msk; SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; } void delay_mks(uint32_t x) { SysTick->VAL &= ~SysTick_VAL_CURRENT_Msk; SysTick->VAL = SYSLOCK/(1000000-1); SysTick_CNT = x; while (SysTick_CNT); } void SysTick_Handler(void) { if (SysTick_CNT > 0) SysTick_CNT--; } void LCD_INIT(void) { LCD_PINS0; delay_mks(20000); sendbyte(0x33, 0); delay_mks(40); sendbyte(0x32, 0); delay_mks(40); sendbyte(0x28, 0); delay_mks(40); sendbyte(0x0C, 0); sendbyte(0x06, 0); sendbyte(0x01, 0); } void sendbyte(int16_t b, uint8_t mode) { LCD_PINS0; GPIOB->ODR &= ~(b & 0xF0); if (mode == 1) A1; else A0; pulse(); LCD_PINS0; GPIOB->ODR &= ~((b & 0x0F) << 4); if (mode == 1) A1; else A0; pulse(); } void pulse(void) { E0; delay_mks(22); E1; delay_mks(22); E0; delay_mks(22); } void sendChar(char *e) { char *text; text = e; while ((*text != 0) && (*text != 0)) { sendbyte(*text, 1); text++; } } void setPos(uint8_t row, uint8_t col) { uint8_t address = 0; if (row == 0) address = 0; else address = 0x40; address |= col; sendbyte(0x80 | address, 0); } int main(void) { PORTS_INIT(); SysTick_INIT(); LCD_INIT(); setPos(0,2); sendChar("sass"); while(1) { /* LED_ON; delay_mks(200000); LED_OFF; delay_mks(200000);*/ } }
-
Доброго времени суток! Недавно решил продолжить свое изучение микроконтроллеров и с AVR перейти на STM32. Понял специфику и решил применить новые знания на практике. Нашел дисплей MT-16S2H (https://www.melt.com.ru/pdf/mt-16s2h.pdf) и набросал кода для инициализации и вывода символа. Подсветка загорелась, но вывести ничего не получилось) Начал смотреть что написал. Порты инициализировал правильно, сам дисплей вроде тоже, запись данных вроде тоже. Предполагаю что косяк где-то с курсором или символ не правильно как-то вывожу: void setPos(int8_t row, int8_t col) { if (row == 0) col|=0x80; else col|=0xC0; sendbyte(col, 0); } void sendchar(char c) { sendbyte(c, 1); } Это мои предположения где может быть ошибка, надеюсь знаток найдется. Весь код прикладываю ниже. Заранее спасибо за помощь:) main.c
-
Привет всем! Помогите, пожалуйста, я только начал программировать МК STM32F407VG. Программирую в среде keil. Проект создал, все ок. НО есть единственное НО, в котором я не могу разобраться. Программа самая простая зажечь светодиоды на плате. #include "stm32f4xx.h" int main(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER = 0x55000000; GPIOD->OTYPER = 0; GPIOD->OSPEEDR = 0; GPIOD->ODR = 0xF000; while(1) { } } Этот код работает, все диоды загораются, все ок. Вот, если рассматривать следующий код, где я переставляю одну строчку GPIOD->ODR = 0xF000; в цикл while(1) #include "stm32f4xx.h" int main(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER = 0x55000000; GPIOD->OTYPER = 0; GPIOD->OSPEEDR = 0; while(1) { GPIOD->ODR = 0xF000; } } То код успешно НЕ работает, соответственно речи нет никакой, чтобы элементарно помигать диодами нет, через цикл for. Перерыл весь инет, инфы по данному вопросу никак не могу найти. Может кто-нибудь знает в чем дело??? Добавлю еще одно: САМОЕ интересное, что через отладку ПОШАГОВО, все работает, светодиоды загораются, а если просто выполнить код, ничего не горит P.S. не кидайте, пожалуйста, помидорами, я только начинающий...
-
Попал мне в руки программатор поддерживающий массу различных микроконтроллеров, в том числе и Атмелевские 51. Решил написать несколько статей для начинающих. Схему решил развивать в процессе в стиле акын - что придумалось то и сделаем. Итак, сначала нужно сделать базовую обвязку - это цепи сброса и тактирования, а также выведем светодиод для того, чтобы можно было убедиться, что схема работает. Затем собрал это всё на макетной плате. Затем написал программу для проверки работоспособности схемы, заставил помигать светодиодом. Подал питание и светодиодик замигал, что подтвердило работоспособность программатора. Посмотреть работу можно по ссылке https://youtu.be/4VtdcGRhxKY Далее предполагаю усложнить схему для получения чего то полезного. Пишите ваши предложения, что нам соорудить на базе этого контроллера. 11 декабря 2020г. Продолжение. Появилась свободная минутка и я продолжил играться с этой простенькой схемой. На первой схеме не было конденсаторов по 33пФ в обвязке кварцевого резонатора, сейчас я их добавил. Без них схема вполне работоспособна, но лучше их поставить, с ними схема должна работать стабильнее. Ещё я добавил кнопку на всякий случай. Вот новая схема: Теперь наша программа использует прерывание от таймера Т1 которое происходит каждую миллисекунду. Благодаря этому мы можем теперь моргать лампочкой с большей точностью. При отпущенной кнопке мы моргаем с частотой 1Гц, а с нажатой 2Гц. В архиве прилагаю исходники и откомпилированный HEX-файл. Так же приглашаю всех желающих обсудить, посоветовать, предложить что-то своё. Если мне понравится ваше предложение, добавлю в проект. Всем Добра. pr1_2.zip
-
Здравствуйте Необходимо сделать задержку на несколько тиков в STM32 чтобы не зависела от оптимизации компилятора Используется Keil 5 void delay_ns_(void) { __nop(); __nop(); __nop(); } Количество тиков определяю с помощью Data Watchpoint and Trace unit void DWT_init(void) { CoreDebug -> DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // Включаем TRACE // DWT->CYCCNT = 0; // Обнуляем счетчик DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk ; // Разрешаем DWT счетчик } Сделал проверочный код start = DWT->CYCCNT; delay_200ns_72(); finish = DWT->CYCCNT; different = finish - start; При уровне оптимизации 0 different = 34 При уровне оптимизации 3 different = 17 При использовании pragma http://www.keil.com/support/docs/3704.htm #pragma push /* Save existing optimization level */ #pragma O0 /* Optimization level now O0 */ void delay_200ns_72(void) { __nop(); __nop(); __nop(); } #pragma pop /* Restore original optimization level */ При уровне оптимизации 3 different = 17 тоже самое значение. Как решить эту проблему? Получается понизить оптимизацию невозможно?
-
Здравствуйте, мне нужна помощь с подключением дисплея WG12864 к STM32F103C8T6. А именно? Я не нашёл библиотек для него, лишь только ардуиновские. Может у кого есть своя? С STM32 опыта почти нет. Так мигал светодиодом и всё, но зато ардуину я уже знаю всё. Я перерос её и мне хочется освоить стм.
- 4 replies
-
- KS0108
- STM32F103C8T6
-
(and 8 more)
Tagged with:
-
Всем привет! Столкнулся с проблемой которую не удается решить. прописал в файле Drive.h так: typedef struct { uint8_t FlgL; uint8_t FlgR; uint16_t Speed; uint16_t PulseL1; uint16_t PulseL2; uint16_t PulseR1; uint16_t PulseR2; } Motor_; typedef struct { uint8_t Status; } Button_; extern struct Motor_ Motor; extern struct Button_ Button; а в с файле: #include "Drive.h" Motor.Pulse = 3; // зададим значение переменной в структуре Motor в итоге 2 ошибки редефайн.... как правильно с ними работать? За вчера и за сегодня уже наверное 1000 вариантов попробовал.
-
Исследую платку stm32f103c8t6. В качестве ide - Keil mVision v5. Проект на Си++ При работе с UART мне требуется вывести некоторую информацию. Делаю это при помощи следующих функций: void USARTSend(char *ptrOutBuf) { while (*ptrOutBuf) { USART_SendData(USART1, *ptrOutBuf++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } } void USARTSend(int val) { int i = 0; sprintf(buffer, "%x", val); while (buffer[i]) { USART_SendData(USART1, buffer[i]); i++; while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } } void USARTSend(const unsigned char *ptrOutBuf) { while (*ptrOutBuf) { USART_SendData(USART1, *ptrOutBuf++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } } } В некоторых строках вывожу текст следующим вызовом: USARTSend("\r\nUSART1 is ready.\r\n"); Компилируется без ошибок. Вывод сообщений в UART тоже без ошибок. Но в редакторе кода Keil на против последней записи появляется значок warning! Код выполняется верно Как можно избавиться от неприятного предупреждения?
-
Здравствуйте! Возник вопрос по программированию внутренней SRAM мк семейства STM32. Работаю в keil MDK, хочу записать определенную область внутренней оперативной памяти своими значениями, потом считывать эти значения с порта. Библиотека SPL не содержит функций для работы с внутренней оперативкой, только с флэш. Если я правильно понял, область SRAM начинается с адреса 0х2000 000 и к ней МК может обращаться на прямую без задержек, можно ли прописывать адреса SRAM прямо в си через указатели, писать в них и читать? Как можно писать\читать свои данные во внутреннюю SRAM STM32 по заранее указанным адресам?
-
Всем привет. Программирую на STM32F103 на Keil, и не могу откомпилировать следующий код на картинке, сразу подписывает ошибку. И перезагружал все, и другие варианты пробовал типа ссылка указатель но не идет, названия переменных правильные, мож с Кейлом что, никто не встречался с подобным?