/* USER CODE BEGIN 0 */
void delay_us(uint32_t ii)
{
uint32_t temp;
SysTick->LOAD=ii*8;
SysTick->VAL=0x00;
SysTick->CTRL=0x01;//2号位1使用内核时钟
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));
SysTick->CTRL=0X00;
SysTick->VAL=0X00;
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,1);
delay_us(1);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,0);
delay_us(1);
//
}
/* USER CODE END 3 */
}
说明:这里虽然是理论上延时1um,但是实际上使用keil arm模拟使用了20um那个样子(但是奇怪的是使用Proteus 8.15模式的时候模拟1s时间,Proteus很接近1s,使用了2s,而是不是20s)
在实际使用C8T6的时候1s,单片式实际花费10s,可见这个函数很不严谨。远远不如HAL_DELAY()函数来的严谨(后来发现这个函数可能是准确的---但如果是准确的为什么产生1s时间时候单片机里面不对?难道是单片机有问题?这就涉及到测量单片机晶振频率的问题)
进一步追踪发现:即使使用定时器来产生1us的事情,keil arm也还是无法准确模拟时间,因此更有可能是keil arm软件无法准确模拟us时间,可能软件模拟本身需要很多us吧。那么也许代表着:这个函数可以准确计算时间
本实验采用外部高速时钟8MHZ,systemtick时钟频率8MHZ(没有使用72MHZ)