من فکر میکنم حدکثر فرکانسی که بتونیم با تایمر یه برنامه تو خروجی پورت ایجاد کنیم 36 مگاهرتز باشه چون ماکزیمم فرکانسمون 72 مگاهرتزه.
اما این آپشن خروجی 50 مگاهرتز برای اینه که اگه خواستیم خروجی پی ال ال رو به یکی از پورت ها بدیم وجود داره(پین mco)
نمایش نسخه قابل چاپ
من فکر میکنم حدکثر فرکانسی که بتونیم با تایمر یه برنامه تو خروجی پورت ایجاد کنیم 36 مگاهرتز باشه چون ماکزیمم فرکانسمون 72 مگاهرتزه.
اما این آپشن خروجی 50 مگاهرتز برای اینه که اگه خواستیم خروجی پی ال ال رو به یکی از پورت ها بدیم وجود داره(پین mco)
با سلام خدمت دوستان
این برنامه ی جدید برای تست فرکانس روی پورت
به صورت دسترسی بیتی دستور دادم ولی تهش شد این فرکانس
شکل موج کاملا سوزنی شده ...
مشکل از کجاست ؟؟
[Dear Guest/Member you can't see link before replyclick here to register]
[Dear Guest/Member you can't see link before replyclick here to register]
اینم لینک برنامه ...
اگه میشه این برنامه رو نگاه کنید
ببینید فرکانسش روی چند هست ..
شاید من تنظیمات رو بد انجام داده باشم ...
[Dear Guest/Member you can't see link before replyclick here to register]
با سلام خدمت شما مهندس عزیزنقل قول:
بعد از دو روز کل اینپیج رو خوندم ... چقدر طولانی بووود ولی کاملا ارزشش و داشت :D
دوست عزیز یکی دو تا مشکل دارم با واحد RCC
ببینید همون طور که شما گفتید تو کیل ورژن 5 از توی system_stm32f10x.h استارت اپ میشه فرکانس کاری رو دست زد ..
مثل این عکس :
[Dear Guest/Member you can't see link before replyclick here to register]
فکر کنم تا اینجای مطلب رو درست اومده باشم ... حالا سوالاتی که دارم ؟
1. ایا واقعا فقط با ریمارک کردن این چند خط میشه فرکانس کاری میکرو رو روی 24 با 56 یا72 تنظیم کرد ؟ فقط با ریمارک کردن ؟ احتیاجی نیست کار خاص دیگه ای انجام بدیم ؟؟؟
2. این تنضیمات روی HSI تاثیر داره یا HSE ؟ کدومش انتخاب میشه ؟ انتخاب این دو تا به چه شکل انجام میشه ؟
3. چطور میتونم مطمین بشیم که فرکانس مثلا روی 72 تنظیم شده ؟
4. بعد از مطمین شدن کلاک کاری صحیح میکرو چجوری میشه یه delay هوشمند بنویسیم که بیاد فرکانس میکرو رو خودش بخونه و با تقسیمات بیاد تابع مورد نظرمونو اصلاح کنه . یعنی فرقی نداشه باشه فرکانس چند باشه 1ms توی تابع همون عدد باشه ؟؟؟
5. کار تابع RCC توی preph.. تنظیم hse یا hsi هست یا خود system_stm32f10x.h این کار رو انجام میده و فقط این واحد کارش فعال سازی و کنترل و ... preph.. ها هست ؟؟
شرمنده سوالات طولانی و زیاده ....
با سلام خدمت همه دوستان
من ب stbperiph Driver ورژن 5 adc رو اضافه کردم ولی وقتی کامپایل میکنم خطای زیر رو میده مشکل کجاست؟
[Dear Guest/Member you can't see link before replyclick here to register]
سلام خدمت همه مهندسین گرامی
به نظرتون مشکل این برنامه چیه که دیتا را درست جا به جا نمیکنه
یک بایت دیتا از روی باس سریال دریافت میشه و میره روی باس SPI_1 (Master) 1 و از طریق این باس به SPI_2 (Slave) 2 منتقل میشه و از این طریق دوباره به باس سریال برمیگرده
اصولا برنامه باید درست کار کنه اما درست کار نمیکنه یعنی اصلا دیتا از طریق SPI جابجا نمیشه
کد:#include <stm32f10x.h>
void RCC_Configuration ( void );
void GPIO_Configuration ( void );
void USART_Configuration( void );
void EXTI_Configuration ( void );
void SPI_Configuration ( void );
int main()
{
unsigned long s;
unsigned char a, b;
RCC_Configuration ( );
GPIO_Configuration ( );
USART_Configuration ( );
EXTI_Configuration ( );
SPI_Configuration ( );
do
{
for(s = 0 ; s <100000; s++);
if ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE ) != RESET )
{
a = (uint16_t) USART_ReceiveData ( USART1 );
for(s = 0 ; s <50000; s++);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, a + 1);
b = (uint16_t) SPI_I2S_ReceiveData ( SPI2 );
for(s = 0 ; s <50000; s++);
USART_SendData(USART1, b );while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
}
}while(1);
}
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON); // Set external XTAL For STM osillator ( 8 MHz )
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);
}
/*
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|\
RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
*/
}
void GPIO_Configuration ( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE); // GPIO Clock ENABLE
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Configure GPIO for SPI slave: SCK, MOSI, SS as inputs
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_13| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // Configure SCK and MOSI pins as Input Floating
GPIO_Init(GPIOB, &GPIO_InitStructure);
// Configure GPIO for SPI slave: NSS as AF output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // USART.1 Clock ENABLE
/* USART1 configuration ------------------------------------------------------*/
/* USART1 configured as follow:
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
- USART Clock disabled
- USART CPOL: Clock is active low
- USART CPHA: Data is captured on the middle
- USART LastBit: The clock pulse of the last data bit is not output to
the SCLK pin
*/
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1, &USART_ClockInitStructure);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // Set PORTA.0 as External interrupt PIN
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
// GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE); //enable spi2 & PORTB clock.
SPI_Cmd(SPI1, DISABLE);
SPI_I2S_DeInit( SPI1 );
/* SPI1 configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 , ENABLE); //enable spi2 & PORTB clock.
SPI_Cmd(SPI2, DISABLE);
SPI_I2S_DeInit( SPI2 );
/* SPI1 configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
/* Enable SPI1 */
SPI_Cmd(SPI2, ENABLE);
}
سوالات زیاد شد ولی اساتید نیستن جواب بدن ؟؟؟
سلام مهندسنقل قول:
داره تابع assert_param رو فراخوانی میکنه در صورتی که هیچجا تعریف نشده!
عبارت
در فایل stm32f10x_conf.h رو ریمارک کنید .کد:
#define USE_FULL_ASSERT
با تشکر از پاسختون مهندس جاننقل قول:
این کار رو قبلا انجام دادم ولی تاثیری نداشت .
دوستانی که با کیل ورژن5 کار میکنن چطوری این مشکل رو رفع کردن؟
مشکل assert_param در انتخاب stdperiph:
تو کیل ورژن5 وقتی از زبانه stdperiph drivers یک درایور رو انتخاب کنین در حالت عادی بعد از کامپایل خطای assert_param رو بهتون میده و برای رفع این مشکل باید ایتدا از زبانه project روی پروژه ای که ساختین کلیک کنین:
[Dear Guest/Member you can't see link before replyclick here to register]
بعد از منوی project گزینه option for .... رو انتخاب کنین
[Dear Guest/Member you can't see link before replyclick here to register]
بعد از صفحه ای که باز شد رو زبانه C/C++ رو انتخاب کنین و تو قسمت define این عبارت رو اضافه کنین:
USE_STDPERIPH_DRIVER
[Dear Guest/Member you can't see link before replyclick here to register]
حالا برنامتون رو کامپایل کنین و میبینین مشکلتون رفع شده
خب مهندس کلا برای استفاده از درایور های cmsis باید این define نوشته بشه . قبلا هم چنین بود.. همچنین عبارت STM32F10X_MD در صورت استفاده از سری Medium Density یا معادلش برای سری های دیگر .....
البته کیل 5 یسری مواردش گویا با کیل 4 فرق می کنه .
دوستان ، مهندسین و مدیران عزیز جواب این دو سه تا سوال ما رو نمیدید یا سوالات پست های قبل شو ؟؟؟ :unh:نقل قول:
نوشته اصلی توسط sina_mehraban [Dear Guest/Member you can't see link before replyclick here to register]
سلامنقل قول:
نوشته اصلی توسط sina_mehraban [Dear Guest/Member you can't see link before replyclick here to register]
1- بله
2- HSE
3- از دستور RCC_GetClocksFreq استفاده کن و کلاک قسمتهایی که میخوایی بدونی را میتونی بدست بیاری.
4- کار RCC تنظیم کلاک قسمت های مختلف میکرو هست (هم HSE و هم HSI)
با سلام و عرض ادب، یک سوال داشتم اگر ممکنه راهنمایی بفرمایید!
من lcd برد expansion را برای میکرو stm32f407vg راه اندازی کردم. وقتی خواستم یک تصویر را با آن نمایش بدهم این Error را گرفت:
[Dear Guest/Member you can't see link before replyclick here to register]
امیدوارم دوستان بتوانند راهنمایی کنند. ممنون
- - - Updated - - -
[Dear Guest/Member you can't see link before replyclick here to register]
دستت درد نکنه اقا صادق ....نقل قول:
کم کم دارم لایبراری ها شو میخونم واسه اینکه سر در بیارم .
دوستان کم میان و طول می کشه جواب بدن ولی انصافا لایبراری ها شو خوب توضیح میده .
فقط یه مقدار لمش دسته آدم بیاد راه میوفته ..
راستی مهندس جان سوال من و در مورد اون شکل موج ها تو چند تا پست قبل تر جواب میدی اگر امکانش هست ؟؟؟؟
نظر به اینکه من اون فرکانس رو روی پینی که led روش بود اجرا کردم ..
میتونه از led هم باشه که شکل موج رو تغییر داده . ولی یکبار هم با پروب رو حالت x10 تست کن . معمولا پروبهای اسکوپ تو حالت x1 پهنای باندشون کمه ولی برای x10 خیلی بالاتره ..
سلام این کتابخونه برای مقادیر کمتر از 1 ثانیه عالی جواب میدهنقل قول:
ولی برای ثانیه های بیشتر مثل 2 و 5 و ... درست کار نمیکنه (با استفاده از تابع میلی ثانیه)
با توجه به اینکه این مقادیر بیش از ظرفیت متغیر نیستن و در واقع سرریز ایجاد نمیشه چرا باید این اتفاق رخ بده ؟
ممنون
دوستان کسی با اینتراپت تایمر 2 کیل ورژن 5 کار کرده؟
من توی حلقه اصلی فلگ اینتراپتو بررسی میکنم میبینم فعال شده ولی تابع اینتراپتو فراخونی نمیکنه نمونه کدو میزارم
#include <stm32f10x.h>
#include "delay.c"
#define LED1 GPIOD
#define LED1_BIT GPIO_Pin_2
void TIM2_IRQHandler()
{
TIM_ClearFlag(TIM2, TIM_IT_Update);
LED1->ODR ^= LED1_BIT;
}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm mmmm
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_Init(&NVIC_InitStructure);
}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm mm
void EnableCLK(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE) ;
}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm mmmmmmmm
void TIM_Configuration(void)// Timer Config
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Prescaler = (40000);
TIM_TimeBaseStructure.TIM_Period = (1800);
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm mmmmmmmm
void InitPort()
{
GPIO_InitTypeDef gp1;
//Clock Enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE );
gp1.GPIO_Speed=GPIO_Speed_10MHz;
gp1.GPIO_Pin=LED1_BIT;
gp1.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(LED1,&gp1);
}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm mmmmmm
int main()
{
int i=0;
FlagStatus f;
EnableCLK();
InitPort();
// NVIC_Config();
NVIC_EnableIRQ(TIM2_IRQn);
TIM_Configuration();
TIM_Cmd(TIM2, ENABLE);
while(1)
{
f=TIM_GetITStatus(TIM2,TIM_IT_Update);
//delay_ms(1000);
if(f !=RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
LED1->ODR ^=LED1_BIT;
}
}
}
سلام
برای اینکه مشکلت سریعتر رفع بشه پروژه و قرار بده :wink: