Существует плата с неким функционалом для работы с пк через usb. Используемый мк был msp430, а теперь решили перейти на stm. И при первоначальных тестах у меня возникли 2 проблемы. Первая проблема - это отправка данных с платы через уарт на пк. На прием все работало хорошо. Открыл список регистров, выяснилось что в регистр USART1->DR не записываются данные. Решил проверить, запишется ли значение в usart2->dr. Добавил код настройки 2го уарта, запустил... и обнаружил, что в оба уарта теперь вообще ничего не записывается, ни в один регистр. Попытался убрать код, проблема осталась. Собственно, это 2 проблема. Используемый код
CODE
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
int i;
char* trans_dist;
int trans_n, trans_cur;
char flag_1 = 0;
char text_1[]={'h','e','l','l','o'};
void Transmit_data(char* source, int n)
{
int i=0;
for(;i<n;i++)
{
//volatile char temp;
USART1->SR &= ~USART_SR_TC;
while(!(USART1->SR & USART_SR_TXE));
USART1->DR = *source;
//temp = USART1->DR;
++source;
if (i==(n-1))
flag_1 = 0;
}
}
int main(void)
{
RCC->CR|=RCC_CR_HSION;
while (!(RCC->CR & RCC_CR_HSIRDY));
RCC->CFGR &=~RCC_CFGR_SW;
RCC->CFGR |= RCC_CFGR_SW_HSI;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
GPIOA->CRL |= GPIO_CRL_CNF1_0 | GPIO_CRL_CNF2_1 | GPIO_CRL_MODE2_1 | GPIO_CRL_CNF4_1 | GPIO_CRL_MODE4_1 |
GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;
GPIOA->CRL &= ~(GPIO_CRL_CNF2_0 | GPIO_CRL_CNF4_0);
GPIOA->CRH |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_1 | GPIO_CRH_CNF10_0 | GPIO_CRH_CNF12_1 | GPIO_CRH_MODE12_1;
GPIOA->CRH &= ~(GPIO_CRH_CNF9_0 | GPIO_CRH_CNF12_0);
GPIOB->CRL |= GPIO_CRL_MODE0_1 | GPIO_CRL_MODE1_1 | GPIO_CRL_MODE2_1;
GPIOB->CRH |= GPIO_CRH_MODE10_1 | GPIO_CRH_MODE12_1 | GPIO_CRH_CNF13_0;
GPIOC->CRH |= GPIO_CRH_CNF13_0;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
USART1->BRR = (8000000+19200/2)/19200;
USART1->CR1 |= USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE;
USART1->CR1 |= USART_CR1_UE;
//USART2->BRR = (8000000+19200/2)/19200;
//USART2->CR1 |= USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE;
//USART2->CR1 |= USART_CR1_UE;
NVIC_EnableIRQ(USART1_IRQn);
while(1)
{
if (flag_1)
Transmit_data(text_1, 5);
//USART1->DR |= 49;
}
}
void USART1_IRQHandler(void)
{
//char t;
if(USART1->SR & USART_SR_RXNE)
{
flag_1 = 1;
USART1->SR &= ~USART_SR_RXNE;
//t = USART1->DR;
}
if(USART1->SR & USART_SR_TXE)
{
//USART1->SR &= ~USART_SR_TXE;
}
}
#include "stm32f10x_rcc.h"
int i;
char* trans_dist;
int trans_n, trans_cur;
char flag_1 = 0;
char text_1[]={'h','e','l','l','o'};
void Transmit_data(char* source, int n)
{
int i=0;
for(;i<n;i++)
{
//volatile char temp;
USART1->SR &= ~USART_SR_TC;
while(!(USART1->SR & USART_SR_TXE));
USART1->DR = *source;
//temp = USART1->DR;
++source;
if (i==(n-1))
flag_1 = 0;
}
}
int main(void)
{
RCC->CR|=RCC_CR_HSION;
while (!(RCC->CR & RCC_CR_HSIRDY));
RCC->CFGR &=~RCC_CFGR_SW;
RCC->CFGR |= RCC_CFGR_SW_HSI;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
GPIOA->CRL |= GPIO_CRL_CNF1_0 | GPIO_CRL_CNF2_1 | GPIO_CRL_MODE2_1 | GPIO_CRL_CNF4_1 | GPIO_CRL_MODE4_1 |
GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;
GPIOA->CRL &= ~(GPIO_CRL_CNF2_0 | GPIO_CRL_CNF4_0);
GPIOA->CRH |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_1 | GPIO_CRH_CNF10_0 | GPIO_CRH_CNF12_1 | GPIO_CRH_MODE12_1;
GPIOA->CRH &= ~(GPIO_CRH_CNF9_0 | GPIO_CRH_CNF12_0);
GPIOB->CRL |= GPIO_CRL_MODE0_1 | GPIO_CRL_MODE1_1 | GPIO_CRL_MODE2_1;
GPIOB->CRH |= GPIO_CRH_MODE10_1 | GPIO_CRH_MODE12_1 | GPIO_CRH_CNF13_0;
GPIOC->CRH |= GPIO_CRH_CNF13_0;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
USART1->BRR = (8000000+19200/2)/19200;
USART1->CR1 |= USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE;
USART1->CR1 |= USART_CR1_UE;
//USART2->BRR = (8000000+19200/2)/19200;
//USART2->CR1 |= USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE;
//USART2->CR1 |= USART_CR1_UE;
NVIC_EnableIRQ(USART1_IRQn);
while(1)
{
if (flag_1)
Transmit_data(text_1, 5);
//USART1->DR |= 49;
}
}
void USART1_IRQHandler(void)
{
//char t;
if(USART1->SR & USART_SR_RXNE)
{
flag_1 = 1;
USART1->SR &= ~USART_SR_RXNE;
//t = USART1->DR;
}
if(USART1->SR & USART_SR_TXE)
{
//USART1->SR &= ~USART_SR_TXE;
}
}
PA2 и PA3 - выход и вход для usart2, PA9 и PA10 - выход и вход для usart1
Среда: CooCox CoIDE 1.6.2, мк: stm32f100c4
Интересно ваше мнение по поводу обеих проблем.